【问题标题】:Get wrong id onItemClick在ItemClick上获取错误的ID
【发布时间】:2014-09-28 17:45:33
【问题描述】:

我尝试将 ListView 与两个 ImageVies 一起使用。第一个是一些照片,第二个是删除照片按钮。

我尝试处理我单击的项目,但总是得到与两个 ImageView 不同的相同 ID。 我也尝试在 Adapter 类中执行此操作,但发现这不是很好的解决方案。

也许你可以说,我哪里错了?

列表更新/初始化部分

public void updateList(final ArrayList<String> arrayList) {
        CustomList adapter = new
                CustomList(FullInfoActivity.this, arrayList);
        HorizontalListView list = (HorizontalListView) findViewById(R.id.HorizontalListView);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
               Log.e("Parent", String.valueOf(parent.getId()) +" " +R.id.img + " "+R.id.image_delete + " "+parent.getItemAtPosition(position));
                switch (parent.getId()) {
                    case R.id.img:
                        Toast.makeText(getApplicationContext(), "111111111", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.image_delete:
                        Toast.makeText(getApplicationContext(), "222222222", Toast.LENGTH_SHORT).show();
                        break;
                }

列表视图项

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:context=".MainActivity" >
    <ImageView
        android:id="@+id/img"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:scaleType="centerCrop"
        android:visibility="invisible"
        android:layout_marginRight="8dp"
        android:clickable="true"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:contentDescription="image" />

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar"
        android:layout_centerVertical="true"
        android:layout_alignLeft="@+id/img"
        android:layout_alignStart="@+id/img"
        android:layout_alignRight="@+id/img"
        android:layout_alignEnd="@+id/img"
        android:visibility="visible" />

    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:id="@+id/image_delete"
        android:src="@drawable/ic_action_cancel_light"
        android:layout_alignTop="@+id/img"
        android:layout_alignRight="@+id/img"
        android:layout_alignEnd="@+id/img"
        android:background="#7f989e9a"
        android:clickable="true"
        android:contentDescription="Cancel" />

</RelativeLayout>

自定义列表适配器

public class CustomList extends ArrayAdapter<String> {
    private final Activity context;
    private final ArrayList<String> arrayList;

    public CustomList(Activity context, ArrayList<String> arrayList) {
        super(context, R.layout.list_single, arrayList);
        this.context = context;
        this.arrayList = arrayList;
    }

    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.list_single, null, true);

        final ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        final ProgressBar pb = (ProgressBar) rowView.findViewById(R.id.progressBar);
        final Animation show = AnimationUtils.loadAnimation(context, R.anim.appear_animation);
        ImageView delete = (ImageView) rowView.findViewById(R.id.image_delete);
            final Timer myTimer = new Timer(); // Создаем таймер
        myTimer.schedule(new TimerTask() { // Определяем задачу
                @Override
                public void run() {
                    File f = new File(arrayList.get(position));
                    if (f.exists()) {
                        final Bitmap myBitmap = BitmapFactory.decodeFile(f.getAbsolutePath());
                        if (myBitmap != null) {
                            myTimer.cancel();
                            context.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    pb.setVisibility(View.GONE);
                                    imageView.setImageBitmap(Bitmap.createScaledBitmap(myBitmap, 120, 120, false));
                                    imageView.setVisibility(View.VISIBLE);
                                    imageView.startAnimation(show);
                                }
                            });
                        }
                    }
                }
            }, 100, 100);
        return rowView;
    }

}

【问题讨论】:

  • 您需要在CustomList 内为两个按钮设置onClick 侦听器,因为onItemClick 方法仅在单击ListView 行而不是从行单击任何子视图时触发。例如Multi Touch List View : Multi Click List View Demo in Android : Click button in List View in Android
  • 作为一个注释,请重复使用您对性能很重要的视图。
  • @ρяσѕρєяK 我不能,因为那我不能在我的活动中更新列表视图。或者我现在不知道如何做到这一点。并且随着 setonclick 列表视图变得不可滚动
  • 你在这个 String.valueOf(parent.getId()).?中得到了什么?

标签: android android-listview onitemclick


【解决方案1】:

获取与两个 ImageView 不同的相同 id。

因为你有 row id 视图,它与他们孩子的视图不同。所以在你的getView 中使用下面的代码:

ImageView delete = (ImageView) rowView.findViewById(R.id.image_delete);
delete.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // do your work
    }
});

【讨论】:

  • 我这样做了,但发现我无法调用我活动中的方法 updateList。
  • 为什么要调用那个方法?
  • 整个 ListView 也变得不可拖动
  • 对于更新 listView 您不需要再次创建适配器,只需更改适配器数据并为您的 dragable 调用 notifyDataSetChanged 您必须问另一个问题,因为我认为按钮可以防止触摸事件,但我是确定它有解决方案,最后我认为必须采取我的方法。
  • 尝试将android:descendantFocusability="blocksDescendants" 添加到您的listView 并将android:focusable="false" 添加到您的imageView
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多