【问题标题】:RecyclerView ItemClick to Detail Activity is not workingRecyclerView ItemClick to Detail 活动不起作用
【发布时间】:2017-07-16 18:42:53
【问题描述】:

我在我的应用中实现了一个 recyclerView。我从存储在资产文件夹中的本地 json 解析数据。现在我可以在 recyclerview 中看到解析后的数据。我创建了另一个 Activity,它将显示这个 recyclerview 的详细活动。看到这个细节我已经实现了 onItemClick 监听器方法。但不幸的是,这种方法在我的应用程序中不起作用。我不知道在recyclerview的情况下如何解决这个问题。

我的 ItemClickListener 接口是

public interface ItemClickListener {
void onItemClick(int pos);
}

我的 Adpater 类是

public class MyColleaguesAdapter extends 
RecyclerView.Adapter<MyColleaguesAdapter.ColleagueHolder> {


private List<MyColleageModel> colleagueObject;
private Context context;

public MyColleaguesAdapter(List<MyColleageModel> colleagueObject, Context context) {

    this.colleagueObject = colleagueObject;
    this.context = context;
}

@Override
public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.colleage_row_layout,parent,false);
    return new ColleagueHolder(view);
}

@Override
public void onBindViewHolder(ColleagueHolder holder, int position) {
    final MyColleageModel myColleague=colleagueObject.get(position);
    //holder.colleaguePicture.setImageResource(myColleague.getImageResourceId());
    holder.mobile.setText(myColleague.getMobile());
    holder.mail.setText(myColleague.getMail());
    holder.name.setText(myColleague.getName());
    holder.company.setText(myColleague.getCompany());
    holder.department.setText(myColleague.getDepartment());
    holder.title.setText(myColleague.getTitle());

    //do not know how to implement it
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = (int)
        }
    });
}

@Override
public int getItemCount() {
    return colleagueObject.size();
}
////open activity
private void openDetailActivity(String...details)
{
    Intent i=new Intent(context,DetailMyColleague.class);
    i.putExtra("mobile",details[0]);
    i.putExtra("mail",details[1]);
    i.putExtra("name",details[2]);
    i.putExtra("company",details[3]);
    i.putExtra("department",details[4]);
    i.putExtra("title",details[5]);
    context.startActivity(i);
}


public class ColleagueHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    public CardView cardView;
    public ImageView colleaguePicture;
    public TextView mobile;
    public TextView mail;
    public TextView name;
    public TextView company;
    public TextView department;
    public TextView title;
    ItemClickListener itemClickListener;

     public ColleagueHolder(View itemView) {
        super(itemView);
        //colleaguePicture=(ImageView)itemView.findViewById(R.drawable.profile_image);
        mobile=(TextView)itemView.findViewById(R.id.colleague_mobile);
        mail=(TextView) itemView.findViewById(R.id.colleague_mail);
        name=(TextView) itemView.findViewById(R.id.colleague_name);
        company=(TextView)itemView.findViewById(R.id.company_name);
        department=(TextView) itemView.findViewById(R.id.department_name);
        title=(TextView) itemView.findViewById(R.id.job_title);
        cardView=(CardView)itemView.findViewById(R.id.cvSingleUser);
    }


    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick(this.getLayoutPosition());
    }
    public void setItemClickListener(ItemClickListener itemClickListener)
    {
        this.itemClickListener=itemClickListener;
     }
   }

 }

我的主要活动类是

public class MyColleaguesPage extends AppCompatActivity{

private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<MyColleageModel> colleagueObject;
InputStream is;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);
    recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MyColleaguesPage.this);
    recyclerView.setLayoutManager(layoutManager);
    new JSONTask().execute();

}



    public class JSONTask extends AsyncTask<String, String, List<MyColleageModel>> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected List<MyColleageModel> doInBackground(String... params) {

        colleagueObject = new ArrayList<MyColleageModel>();

        try {

            JSONObject obj = new JSONObject(loadJSONFromAsset());
            JSONArray m_jArry = obj.getJSONArray("contacts");
            MyColleageModel my_clg;

            for (int i = 0; i < m_jArry.length(); i++) {
                JSONObject jo_inside = m_jArry.getJSONObject(i);
                //my_clg=new MyColleageModel();
                String val1 = jo_inside.getString("mobile");
                String val2 = jo_inside.getString("mail");
                String val3 = jo_inside.getString("name");
                String val4 = jo_inside.optString("company");
                String val5 = jo_inside.optString("department");
                String val6 = jo_inside.optString("title");
                my_clg = new MyColleageModel(val1, val2, val3, val4, val5, val6);
                colleagueObject.add(my_clg);
            }


        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(final List<MyColleageModel> result) {
        super.onPostExecute(result);

            adapter = new MyColleaguesAdapter(colleagueObject, getApplicationContext());
            recyclerView.setAdapter(adapter);


    }
 }

   private String loadJSONFromAsset() {
    String json = null;
    try {

        is = getAssets().open("colleagues.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);

        is.close();

        json = new String(buffer, "UTF-8");


    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;

   }
}

我的详细活动类是

public class DetailMyColleague extends AppCompatActivity {


private TextView jsonName;
private TextView jsonRole;
private TextView jsonCompany;
private TextView jsonMobile;
private TextView jsonEmail;
private TextView jsonDepartment;


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

    // Showing and Enabling clicks on the Home/Up button
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
    // setting up text views and stuff
    setUpUIViews();

    Intent intent = getIntent();

    //RECEIVE DATA
    String mobil=intent.getExtras().getString("mobile");
    String mail=intent.getExtras().getString("mail");
    String name=intent.getExtras().getString("name");
    String company=intent.getExtras().getString("company");
    String dept=intent.getExtras().getString("department");
    String title=intent.getExtras().getString("title");
    //BIND DATA
    jsonMobile.setText(mobil);
    jsonEmail.setText(mail);
    jsonName.setText(name);
    jsonCompany.setText(company);
    jsonDepartment.setText(dept);
    jsonRole.setText(title);

}

private void setUpUIViews() {

    jsonName=(TextView)findViewById(R.id.json_name);
    jsonRole=(TextView)findViewById(R.id.json_role);
    jsonCompany=(TextView)findViewById(R.id.json_company);
    jsonMobile=(TextView)findViewById(R.id.json_mobile);
    jsonEmail=(TextView)findViewById(R.id.json_email);
    jsonDepartment=(TextView)findViewById(R.id.json_department);
}

}

【问题讨论】:

  • 为什么要创建自己的 onClickInterface?
  • @MartinDeSimonen 我是 android 开发的新手。我已经阅读了一篇文章,然后尝试实现它。但是当我单击该项目时没有任何反应。你能解释一下为什么会这样吗?我从早上就开始关注这个问题

标签: android json android-intent android-recyclerview android-adapter


【解决方案1】:

首先,您没有在任何 View 上设置 OnClickListener,因此永远不会触发 onClick() 方法,因此不会发送对您的 onItemClickListener 的回调。

其次,你不需要为此实现接口,你可以简单地在onBindViewHolder()方法中设置onClickListener,就像这样:

holder.cardView.setTag(position);

holder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int pos = (int)view.getTag()
    openDetailActivity(myColleague.getMobile(),myColleague.getMail(), myColleague.getName(),
            myColleague.getCompany(), myColleague.getDepartment(), myColleague.getTitle());

    }
});

这里使用 setTag() 方法将当前位置发送到 onClick() 方法以引用被点击的视图。

在 ViewHolder 类中写入这一行以获得 CardView 参考。

cardView=(CardView) itemView.findViewById(R.id.cardview_id);

【讨论】:

  • viewIWantToClick 是什么意思?
  • 这是被点击的视图对象,如果你想让整个项目可点击,那么从xml获取父布局的引用并在其上设置onclick监听器。对于测试,您可以在任何视图上设置 clicklistener,例如标题
  • 我有一个卡片视图。我想点击那个卡片视图。而不是名称、角色、部门等单个项目
  • 我应该在 holder 类中声明这个 Cardview 吗?
  • 是的,就是这样。在回收器视图项中使用的所有视图都在 ViewHolder 类中声明。
【解决方案2】:

您可以简单地将OnClickListener 设置为持有者的父布局,即RelativeLayout 或LinearLayout 等。

holder.relative_layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openDetailActivity(myColleague.getMobile(),myColleague.getMail(), myColleague.getName(),
                myColleague.getCompany(), myColleague.getDepartment(), myColleague.getTitle());

        }
    });

【讨论】:

  • 你能解释一下什么是 relative_layout 吗?
  • 无论您的父布局是什么,例如。 ColleagueHolder 中的所有视图项,即所有 TextViews、ImageViews 都在一个父布局下,您必须为该布局设置一个 onClickListener。
  • 是的,我有一个 colleague_row_layout- 但是我怎样才能在这里贴花呢?
  • 不,colleague_row_layout 可能是您的 xml 文件的名称。考虑下面的例子,这里是 xml 文件,最外面的 xml 标签是这个文件中的父布局 - code for xml file 在这个文件中,父布局是
  • 应在 holder 类中处理 cardview 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2013-12-11
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多