更新ViewHolder类中的商品数据

时间:2019-04-18 16:54:33

标签: android android-recyclerview android-viewholder listview-adapter

我对ViewHolder感到困惑。我刚刚开始将我所有的ArrayAdapters和ListView转换为带有适配器和支架的RecyclerView。 转换时,我陷入了设置点击侦听器的方式。

基本上,过去我会得到该位置,在位置 pos 处检索该项目,然后根据ArrayList项中的数据执行该项目的布局。

@SuppressLint("ClickableViewAccessibility")
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.list_items, null, true);


    Data currentData = (Data) getItem(position);

    myTextView.setText(currentData.title);
    myTextView.setOnClickListener(v->actionThatDependsOnPositionAndOrData());


 }

因此,在我的ClickListener中,我将有一些取决于位置的东西,并且需要某种回调来更新ArrayList或类似的东西。

现在,看来我再也找不到方法了。

@Override
public <T extends DownloadableData> void bindData(T data) {
    super.bindData(data);

    myTextView.setOnClickListener(v->actionThat????)
}

那我该如何指定位置?

因为现在,我在clickListener的AsyncTask中找到的唯一方法是调用具有RecyclerView的Fragment并执行此操作

 public void myCallback(Data data, String newTitle){

     int index=allData.indexOf(data);
     performModificationOfData(data); //like data.title=newTitle;
     allData.set(index, data);
     adapter.notifyDataSetChanged(); //not even sure this is needed..
    }

没有更聪明的方法吗?

1 个答案:

答案 0 :(得分:0)

请检查以下适配器,它将帮助您了解如何在适配器内部的视图上设置单击侦听器。在onBindViewHolder方法内部的setOnItemClick侦听器。然后在活动中设置该回调,您将获得带有数据和位置的该回调的覆盖方法。然后对项目单击执行任何操作。

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.ImageView;  
import android.widget.RelativeLayout;  
import android.widget.TextView;  
import android.widget.Toast;  


public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder>{  
    private MyListData[] listdata;  
    private ItemclickCallback callback;

   // RecyclerView recyclerView;  
    public MyListAdapter(MyListData[] listdata) {  
        this.listdata = listdata;  
    }

    public void setCallback(ItemclickCallback callback) {
        this.callback = callback;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());  
        View listItem= layoutInflater.inflate(R.layout.list_item, parent, false);  
        ViewHolder viewHolder = new ViewHolder(listItem);  
        return viewHolder;  
    }  

    @Override  
    public void onBindViewHolder(ViewHolder holder, int position) {  
        final MyListData myListData = listdata[position];  
        holder.myTextView.setText(listdata[position].getDescription());  
        holder.imageView.setImageResource(listdata[position].getImgId());  
        holder.myTextView.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                Toast.makeText(view.getContext(),"click on item: "+myListData.getDescription(),Toast.LENGTH_LONG).show(); 
                onTextViewClick(myListData,position); 
            }  
        });  
    }  


    interface ItemclickCallback{
        void onTextViewClick(MyListData myListData,int position);
    }

    @Override  
    public int getItemCount() {  
        return listdata.length;  
    }  

    public static class ViewHolder extends RecyclerView.ViewHolder {  
        public ImageView imageView;  
        public TextView myTextView;  
        public ViewHolder(View itemView) {  
            super(itemView);  
            this.imageView = (ImageView) itemView.findViewById(R.id.imageView);  
            this.myTextView = (TextView) itemView.findViewById(R.id.myTextView);  
        }  
    }  
}