Обновление данных элемента из класса ViewHolder - PullRequest
0 голосов
/ 18 апреля 2019

Я запутался с 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????)
}

Так как мне указать позицию?

Потому что сейчас единственный способ, который я нашел в своей AsyncTask в clickListener - это вызвать фрагмент, имеющий RecyclerView, и сделать это

 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 голосов
/ 18 апреля 2019

Пожалуйста, проверьте следующий адаптер, это поможет вам понять, как настроить прослушиватель щелчка на представлении внутри адаптера.Внутри метода 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);  
        }  
    }  
}  
...