当RecyclerView的数据更改时,更新Fragment中的TextView

时间:2019-05-22 17:46:13

标签: android kotlin android-recyclerview

在我的片段中,我有2个视图。一个Textview和一个RecyclerView。 Textview本质上显示了RecyclerView的当前大小。因此,当在适配器类中删除一行时,我需要相应地更新TextView的值。

单击removeBtn后,该行已成功删除,但是我需要相应地更新Fragment中的TextView。

片段

                titleText.text = "SIZE (" + arrayStringList().size.toString() + ")"
                //...
                //... 
                //Set RecyclerView Adapter
                mRecyclerView.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context)
                val adapter = MRecyclerView(context!!, arrayStringList)
                mRecyclerView.adapter = adapter

RECYCLERVIEW

holder.removeBtn{ 
   mData.removeAt(position)
   notifyItemRemoved(position)
 }

是否可以在片段中放入某种侦听器来检测数据何时更改?还是有一种方法可以在单击removeBtn时将数据从recyclerview发送回片段?

3 个答案:

答案 0 :(得分:1)

在recyclerView类中创建一个接口,并在fragment中实现该接口。单击删除按钮后,请调用此界面。在Fragment class中,使用adapter.getItemCount更新文本视图。

在适配器中

allow(my_model_instance).to receive(:bar)

此接口将在片段类中实现,您可以在其中使用itemCount更新textView。

interface ItemCallback{
    void updateTextView();
}

答案 1 :(得分:0)

您可以通过回叫来做到这一点。创建一个接口并在Fragment上实现。并将接口的引用传递给适配器。当您触发事件以从“回收者”视图中删除项目时,请调用接口方法(您在Activity上实现)。在该回调方法中,您需要将值设置为文本视图。要在TextView上设置值,您可以调用 size()方法,并设置从其返回的值。例如,您要传递给适配器的列表是 mData 。收到回叫时,调用参考上的调用大小方法并按以下代码设置值。

titleText.setText(String.valueOf(mData.size())).

希望这会对您有所帮助。

注意:您需要调用String.valueOf方法,因为size方法返回整数值,因此需要进行强制转换。

答案 2 :(得分:0)

“或者当单击removeBtn时,是否有办法将数据从recyclerview发送回片段?”答案是肯定的

一种方法是将自己的点击监听器(接口)传递给适配器,这样您就可以控制片段中的点击,例如

A1)创建一个界面

public interface ItemTouchListener {

    void onCardClick(View view, int position);

    boolean onCardLongClick(View view, int position);

}

A2)在您的片段中实现此接口

public class YourFragment extends Fragment implements ItemTouchListener

A3)实现您在片段中创建的方法

@Override
public void onCardClick(View view, int position) {
    if (view.getId() == R.id.removeBtn){
       //update your text
    }else{
      //other buttons
    }
}

@Override
public boolean onCardLongClick(View view, int position) {
  if (view.getId() == R.id.removeBtn){
     //update your text
  } else {
    //other buttons
  }
    return true;
}

A4)在您的适配器中创建此界面并将其设置为按钮

private ItemTouchListener onItemTouchListener;

public YourAdapter(List<Object> list, ItemTouchListener onItemTouchListener) {
    this.onItemTouchListener = onItemTouchListener;
    this.list = list;
}

removeBtn = view.findViewById(R.id.removeBtn);
        removeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemTouchListener.onCardClick(v, getAdapterPosition());
            }
        });
        removeBtn.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                onItemTouchListener.onCardLongClick(view, getAdapterPosition());
                return true;
            }
        });

A5),现在当您创建适配器时,它将询问ItemTouchListener,您可以通过传递“ this”来给予它

 YourAdapter adapter = new YourAdapter(this);

A6),您可能还希望为适配器提供类似getCount之类的方法,该方法可返回列表大小

public int getCount(){
  list.size();
}

然后您可以像myAdapter.getCount

这样称呼它