使用 CardView BaseAdapter OnItemClick 自定义 ListView

Posted

技术标签:

【中文标题】使用 CardView BaseAdapter OnItemClick 自定义 ListView【英文标题】:Custom ListView using CardView BaseAdapter OnItemClick 【发布时间】:2019-02-13 23:41:30 【问题描述】:

我真的需要帮助和一些解决方案

我尝试使用 CardViewBaseAdapter 制作自定义 ListView,我有 5 个项目列表。每个列表都包含一个图像、标题和描述。 我遇到了一些问题,我不知道如何使用 Click each ListView 进入不同的新活动

这是 baseAdapter java 代码

package com.projectskripsi.wisatajogja.adapter;

import android.content.Context;
import android.media.Image;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.projectskripsi.wisatajogja.R;
import com.projectskripsi.wisatajogja.model.Model;

import java.util.ArrayList;



public class WisataAdapter extends BaseAdapter 

    private Context context;
    private ArrayList<Model> models;

    public WisataAdapter(Context context, ArrayList<Model> models) 
        this.context = context;
        this.models = models;
    

    @Override
    public int getCount() 
        return models.size();
    

    @Override
    public Object getItem(int position) 
        return models.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        if (convertView == null)

            convertView = View.inflate(context , R.layout.list_item1 ,null);
        
        ImageView images = (ImageView) convertView.findViewById(R.id.wisataimage);
        TextView title = (TextView) convertView.findViewById(R.id.namawisataTV);
        TextView about = (TextView) convertView.findViewById(R.id.wisatadesTV);

        Model model = models.get(position);

        images.setImageResource(model.getWisataimage());
        title.setText(model.getWisataTitle());
        about.setText(model.getAboutTitle());

        return convertView;
    

和这个模型java

package com.projectskripsi.wisatajogja.model;




public class Model 

    private int wisataimage;
    private String wisataTitle;
    private String aboutTitle;

    public Model(int wisataimage, String wisataTitle, String aboutTitle) 
        this.wisataimage = wisataimage;
        this.wisataTitle = wisataTitle;
        this.aboutTitle = aboutTitle;
    

    public int getWisataimage() 
        return wisataimage;
    

    public void setWisataimage(int wisataimage) 
        this.wisataimage = wisataimage;
    

    public String getWisataTitle() 
        return wisataTitle;
    

    public void setWisataTitle(String wisataTitle) 
        this.wisataTitle = wisataTitle;
    

    public String getAboutTitle() 
        return aboutTitle;
    

    public void setAboutTitle(String aboutTitle) 
        this.aboutTitle = aboutTitle;
    

还有这个 MainActivity Java

package com.projectskripsi.wisatajogja;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.projectskripsi.wisatajogja.adapter.WisataAdapter;
import com.projectskripsi.wisatajogja.model.ListDetails1;
import com.projectskripsi.wisatajogja.model.Model;

import java.util.ArrayList;

public class GunungKidul extends AppCompatActivity 

    private ListView listView;
    private ArrayList<Model> models;
    private WisataAdapter wisataAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gunung_kidul);

        listView = (ListView) findViewById(R.id.listwisata1);
        models = ListDetails1.getList();

        wisataAdapter = new WisataAdapter(GunungKidul.this,models);
        listView.setAdapter(wisataAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

                Model model = models.get(position);

                Intent intent = new Intent(GunungKidul.this, Pantai_Kesirat.class);
                intent.putExtra("wisataTittle", listView.getItemAtPosition(position).toString());
                startActivity(intent);




            
        );

    

谢谢你的回答..我真的需要帮助..

【问题讨论】:

【参考方案1】:
  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     @Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
               Model model= (Model) wisataAdapter.getItem(position);

                if(position==0)
                   Intent intent = new Intent(GunungKidul.this, Pantai_Kesirat.class);
                   //To pass whole model data with intent:
                   intent.putExtra("MyClassKey", model);
                   startActivity(intent);
                
                else if
                    Intent intent = new Intent(GunungKidul.this,  Goa_Pindul.class);
                    //To pass whole model data with intent:
                    intent.putExtra("MyClassKey", model);
                    startActivity(intent);
                
        else if
                    Intent intent = new Intent(GunungKidul.this, Pantai_Baron.class);
                    //To pass whole model data with intent:
                    intent.putExtra("MyClassKey", model);
                    startActivity(intent);
                
        else if
                    Intent intent = new Intent(GunungKidul.this, Goa_Jomblang.class);
                    //To pass whole model data with intent:
                    intent.putExtra("MyClassKey", model);
                    startActivity(intent);
                
        else if
                    Intent intent = new Intent(GunungKidul.this, AirTerjun.class);
                    //To pass whole model data with intent:
                    intent.putExtra("MyClassKey", model);
                    startActivity(intent);
                



                            
                        )

;

使用此代码但请始终记住您的卡片位置或索引值以及单击 cardView 时应打开哪个活动,如果您单击第一个 cardView 打开 Pantai_Kesirat 活动

【讨论】:

为什么是models.get(position)); //位置变红了? 我做了一些修改,请看看这个并尝试【参考方案2】:

像这样在模型类中使用 Serializable:

package com.projectskripsi.wisatajogja.model;

    public class Model implements Serializable 

        private int wisataimage;
        private String wisataTitle;
        private String aboutTitle;

        public Model(int wisataimage, String wisataTitle, String aboutTitle) 
            this.wisataimage = wisataimage;
            this.wisataTitle = wisataTitle;
            this.aboutTitle = aboutTitle;
        

        public int getWisataimage() 
            return wisataimage;
        

        public void setWisataimage(int wisataimage) 
            this.wisataimage = wisataimage;
        

        public String getWisataTitle() 
            return wisataTitle;
        

        public void setWisataTitle(String wisataTitle) 
            this.wisataTitle = wisataTitle;
        

        public String getAboutTitle() 
            return aboutTitle;
        

        public void setAboutTitle(String aboutTitle) 
            this.aboutTitle = aboutTitle;
        
    

然后您的第一个活动将数据传递给列表视图项单击事件上的另一个活动,如下所示:

public class GunungKidul extends AppCompatActivity 

    private ListView listView;
    private ArrayList<Model> models;
    private WisataAdapter wisataAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gunung_kidul);

        listView = (ListView) findViewById(R.id.listwisata1);
        models = ListDetails1.getList();

        wisataAdapter = new WisataAdapter(GunungKidul.this,models);
        listView.setAdapter(wisataAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
              Intent intent = new Intent(GunungKidul.this, Pantai_Kesirat.class);
              //To pass whole model data with intent:
             intent.putExtra("MyClassKey", models.get(position));
                startActivity(intent);




            
        );

    

现在在 Pantai_Kesirat 类中,您已经创建了一个模型类对象,例如:

Model model;

然后在您的第二个 Activity 的 onCreate() 方法中,只需从以下意图接收您的数据:

    // To retrieve object in second Activity
   model =(Model) getIntent().getSerializableExtra("MyClassKey");

然后在模型类的 getter 和 setter 方法的帮助下使用模型类的数据

【讨论】:

你能解释更多吗?我在 ListView 中有 5 个 Cardview ..我想在 5 个 Cardview 中可以打开每个活动.. 每个卡片视图在同一活动中打开,其中数据将被更改?? 当你点击任何卡片视图然后打开一个活动 Pantai_Kesirat,正如你在意图中提到的,然后点击 Pantai_Kesirat 活动中可用的所有详细信息,根据你的要求,你可以将数据设置到不同的视图中 你能给我密码吗?我有..Pantai_Kesirat 活动、Goa_Pindul 活动、Pantai_Baron 活动、Goa_Jomblang 活动 AirTerjun 活动..我希望 5 个卡片视图打开每个活动..卡片视图具有相同的活动名称 当然,只需在 onItemClick() 方法中添加 if 和 else if 条件,如下所示:但你不知道 cartView 的哪个位置打开了哪个活动【参考方案3】:

欢迎来到 *** :)

所以我对你定义的问题有一个简单的解决方案,检查它是否适合你。

    您实现了一个点击监听器,在您的 MainActivity(具有 CardViews 列表的那个)中说“CardClickListener”。 在为 ListView 启动适配器时传递 this。 在您的适配器中,每次点击 CardItem 时,您都会调用此 clickListener 并将与之关联的数据对象传递给 MainActivity。 解析 MainActivity 中的数据对象,并在此基础上转到相应的 Activity。

虽然此解决方案肯定会奏效,但我不认为这是解决您的问题的最佳解决方案。一旦你有一些工作,尝试改进它。

希望这会有所帮助!

【讨论】:

你能用代码解释一下我在帖子中分享的内容吗?

以上是关于使用 CardView BaseAdapter OnItemClick 自定义 ListView的主要内容,如果未能解决你的问题,请参考以下文章

Android中BaseAdapter使用基础点

如何使用 baseadapter 自定义列表视图

使用 BaseAdapter 时片段 TabLayout 中的 NullPointerException

Android使用BaseAdapter实现复杂的ListView

使用 BaseAdapter 在 ListView 中显示 ArrayList

Android - MD之CardView的使用