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

问题描述 投票:1回答:2

我已经看到有关在一个活动中显示多个列表视图的多个问题,但我的问题与两者的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);
java android listview
2个回答
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,看看会出现什么。


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);
                }
            });

活动代码。像这样创建Adapter对象

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

                }
}):
© www.soinside.com 2019 - 2024. All rights reserved.