【问题标题】:Android RecyclerView: how do I put data into a Fragment from the Adapter?Android RecyclerView:如何将数据从适配器放入片段?
【发布时间】:2016-08-02 04:56:01
【问题描述】:

我有一个 RecyclerView 列表。我正在尝试在 MainActivity 中设置一个 onItemLongClick 方法来启动一个 DialogFragment。该对话框将要求用户确认他们要删除 RecyclerView 列表中的项目。我想从适配器文件中捕获 RecyclerView 项目的位置,以便片段可以从 SQLite 数据库中删除正确的项目。

我正在尝试使用 setArguments 传递 Bundle 中的 RecyclerView 项目位置。 Android Studio 在“bundle.putInt”行发出以下错误:第二个参数类型错误。找到:“联系人”(我的数据模型),需要“int”。我在这里想念什么?

附言我还有一个“onItemClick”方法可以正确加载另一个名为“ActActivity”的活动,下面也显示了该活动以供参考。 onItemClick 和 onItemLongClick 都在 Adapter 文件中设置了 ClickListener 接口。两种点击方法都使用 Toasts 进行了测试,并且运行良好。

来自活动文件:

...
@Override
public void onItemLongClick(int position, View view) {
    // For API >=14, use getFragmentManager() below.
    Bundle bundle = new Bundle();
    bundle.putInt("item position", **contactListAdapter.getItem(position)**); // error here.

    android.app.FragmentManager fm = getFragmentManager();
    fm.setArguments(bundle);
    DeleteCardViewFragment delCardViewDialog = new DeleteCardViewFragment();
    delCardViewDialog.show(fm,"delcardview dialog");
}

@Override
public void onItemClick(int position, View view) {
    ActActivity.start(this, contactListAdapter.getItem(position)); 
}

来自 RecyclerView 的 Adapter 文件:

public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ContactHolder>{

    private List<Contact> contactList;
    private Context context;

    private RecyclerItemClickListener recyclerItemClickListener;

    public ContactListAdapter(Context context) {
        this.context = context;
        this.contactList = new ArrayList<>();    
    ...

    **public Contact getItem(int position)** {
        return contactList.get(position);
    }

片段文件:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {    
...
Button btnOK = (Button) rootView.findViewById(R.id.btnOK);
    btnOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
                                      // removeItem() here?
            dismiss();
        }
    });

【问题讨论】:

  • 但是你已经在onItemLongClick(int position, View view) 中有position 作为第一个参数,所以使用它
  • 只需将 'contactListAdapter.getItem(position)' 替换为 'position'?
  • 从哪里设置列表 Fragment 或 Activity 中的数据??
  • 如果你是从 Fragment 传递 recyclerview 中的数据列表,我建议你使用界面来完成你的任务

标签: android sqlite android-fragments android-recyclerview


【解决方案1】:

让您的活动实现 View.OnLongClinkListner

    public class MainActivity extends AppCompatActivity implements View.OnLongClinkListner {
@Override
    public boolean onLongClick(View v) {
int position=(Integer)v.getTag();
        return false;
    }
}



 public void remove(int position){
   adapter.remove(position);
}

在你的适配器中

View.OnLongClinkListner  mLongClickListner;
public ContactListAdapter(Context context) {

 mLongClickListner=(View.OnLongClinkListner)context;
}

@Override
        public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = inflater.inflate(R.layout.some_layout, parent, false);
view.setOnLongClickListner(mLongClickListner);
            return new ContactHolder(view);
        }



@Override
        public void onBindViewHolder(final ContactHolder holder, final int position) {
... your code;
holder.itemView.setTag(position);
}

// 从回收站视图中删除项目

public void removeItem(int position)
{
contactList.remove(position);
notifyDataSetChanged();
}

【讨论】:

  • 有意思,我试试。启动 DialogFragment 的代码是否会添加到您的“public boolean onLongClick 部分”中?
  • 是的 DialogFragment frag=new DialogFragment(); Bundle args=new Bundle(); args.putInt("pos", position); frag.setArguments(args); 现在显示您的片段。
  • 好的。那么如何在 Fragment 中从 Adapter 中引用 item 位置以便添加删除代码呢?
  • 我已经更新了代码,只需从您的对话框中调用 removeItem(position)。
  • 好的,但是在 Fragment 中使用什么代码来调用 Adapter 中的 removeItem()?
【解决方案2】:

bundle.putInt 函数在第二个参数中需要一个整数,您正在传递一个“联系人”。 传递 'position' 作为第二个参数,而不是 'contactListAdapter.getItem(position)'

【讨论】:

  • 好的,我会试试的。现在是“fm.setArgments(bundle);”显示错误:无法解析方法。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多