正确地定义一项活动中多个列表的onItemClick行为的方法?

时间:2018-09-02 23:49:56

标签: java android listview

我已经看到有关在一个活动中显示多个列表视图的多个问题,但我的问题与两个活动的onClick行为有关。我除了彼此设置了两个列表视图,然后动态填充它们-效果很好。问题是要为两个列表设置onClick行为。使用我当前的代码,第二个列表将在如果单击第一个列表中的相同项目的情况下将在打开的活动之上打开所需的活动。因此,当用户回退时,由于回退堆栈是错误的,因此将进入错误的活动。

我定义onItemClick行为的代码在这里:

//make listview items respond to clicks and open relevant activity
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // selected item
            String standard = ((TextView) view).getText().toString();

            // Launching new Activity on selecting single List Item
            Intent i = new Intent(SubjectActivity.this, StandardInfoActivity.class);
            // sending data to new activity
            i.putExtra("standard", standard);
            i.putExtra("subject", subjectId);
            i.putExtra("subjectName", subject);
            i.putExtra("level", level);
            startActivity(i);
            finish();
        }
    });

    gradeView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent2, View view,
                                int position, long id2) {
            // Launching new Activity on selecting single List Item
            Intent j = new Intent(SubjectActivity.this, AddGradeActivity.class);
            // sending data to new activity
            j.putExtra("subjectId", subjectId);
            j.putExtra("position", position);
            j.putExtra("level", level);
            j.putExtra("subject", subject);
            startActivity(j);
            finish();

        }
    });

我的猜测是,因为我为两个函数定义了相同的函数,所以在单击第二个列表时将其调用两次,一次单击第一个列表,然后再次单击所需的列表。在这种情况下,定义两个列表的行为的正确方法是什么?

编辑:用于设置适配器的代码:

ArrayList<String> mArrayList = myDb.getStandards(subjectId);

    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this, R.layout.subject_list_item, mArrayList);
    lv.setAdapter(arrayAdapter);

    ArrayList<String> gradeList = myDb.getGrades(subjectId);

    ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<String>(
            this, R.layout.subject_list_item, gradeList);
    gradeView.setAdapter(arrayAdapter2);

2 个答案:

答案 0 :(得分:0)

像这样调用finish()将导致当前活动(https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy)的onDestroy()被调用,这会将其从后堆栈中删除。因此,我认为您可能会回过头来而得到令人惊讶的结果。

查看是否确实触发了两个onItemClickListeners的一种方法是,您可以向两者都添加临时调试消息,然后查看获得的输出类型。就像,您可以尝试Log.d("ClickListener", "lv was clicked");,而另一则尝试Log.d("ClickListener", "gradeView was clicked");,然后检查Logcat并查看结果。

答案 1 :(得分:0)

在适配器中创建一个接口。然后,您可以在您的活动中覆盖方法。 界面:

   public interface ItemClickAdapterListener {
        void itemClick(View v, int position);
    }

项目点击:

 viewHolder.llayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onClickListener.itemClick(view,position);
                }
            });

活动代码。这样创建适配器对象

YourAdpter adapter= new YourAdpter(new YourAdapter.ItemClickAdapterListener() {
  @Override
                public void itemClick(View v, int position) {

                }
}):