Android:自定义列表视图列表元素点击

Posted

技术标签:

【中文标题】Android:自定义列表视图列表元素点击【英文标题】:Android: Custom list view list element click 【发布时间】:2015-07-26 17:09:35 【问题描述】:

我正在为列表视图开发一个带有自定义适配器的应用程序,其中数据来自服务器。自定义适配器由最少两个和最多四个的图像视图组成,取决于来自服务器的数据。如图所示。

根据功能,每个图像视图都具有点击侦听器。

问题是当我单击列表第一项 - 第一个图像视图时它被选中,但是当我单击列表第二项 - 第二个图像视图时,第一个项目选择会发生变化。第一个项目的选择从第一个图像视图变为第二个。

这样下去。

我也尝试了 notifydatasetchange(),因为我的数据存储在列表视图中,而且我在选择时将所选项目的图像视图编号保存在列表视图中。

我现在该怎么办。请给我建议。

【问题讨论】:

你能提供一些代码吗? @Jorge Mendez:对不起,我不能。 @ManojFegde 没有你的代码,帮助你并不容易。 【参考方案1】:

这是一个实际工作的示例代码(已经在设备上测试过)。这可能会帮助您解决问题。唯一的变化是每个项目中图像数量的大小可能不同。希望这会有所帮助:

HomeActivity.java

 public class MainActivity extends AppCompatActivity 

  private static final int LIST_SIZE = 10;

  @Override
  protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ((ListView) findViewById(R.id.list_view)).setAdapter(new SelectableItemsListAdapter(this, LIST_SIZE));
  

  private class SelectableItemsListAdapter extends ArrayAdapter<Object> 

    private int mSize;
    private boolean []mSelectionArray;

    public SelectableItemsListAdapter(Context context, int size) 
      super(context, R.layout.list_item);
      mSize = size;
      int selectableItems = mSize * 4;
      mSelectionArray = new boolean[selectableItems];
      for(int i = 0 ; i < selectableItems ; i++)
        mSelectionArray[i] = false;
      
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
      if(convertView == null)
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
      

      int actualPosition = position * 4;
      View textView = convertView.findViewById(R.id.text_1);
      textView.setTag(actualPosition);
      textView.setOnClickListener(onClickListener);
      textView.setSelected(mSelectionArray[actualPosition]);

      actualPosition++;
      textView = convertView.findViewById(R.id.text_2);
      textView.setTag(actualPosition);
      textView.setOnClickListener(onClickListener);
      textView.setSelected(mSelectionArray[actualPosition]);

      actualPosition++;
      textView = convertView.findViewById(R.id.text_3);
      textView.setTag(actualPosition);
      textView.setOnClickListener(onClickListener);
      textView.setSelected(mSelectionArray[actualPosition]);

      actualPosition++;
      textView = convertView.findViewById(R.id.text_4);
      textView.setTag(actualPosition);
      textView.setOnClickListener(onClickListener);
      textView.setSelected(mSelectionArray[actualPosition]);

      return convertView;
    

    @Override
    public int getCount() 
      return mSize;
    

    private View.OnClickListener onClickListener = new View.OnClickListener() 
      @Override
      public void onClick(View v) 
        int actualPosition = (int) v.getTag();
        mSelectionArray[actualPosition] = !v.isSelected();
        v.setSelected(mSelectionArray[actualPosition]);
      
    ;

  


list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_
          android:layout_
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:orientation="horizontal"
android:background="@android:color/white"
android:layout_margin="10dp">

    <LinearLayout
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:orientation="vertical">

        <TextView android:id="@+id/text_1"
              android:text="Text 1"
              android:layout_
              android:layout_
              android:layout_weight="1"
              android:textColor="@android:color/black"
              android:background="@drawable/selectable_item"
              android:gravity="center"/>

        <TextView android:id="@+id/text_2"
              android:text="Text 2"
              android:layout_
              android:layout_
              android:layout_weight="1"
              android:textColor="@android:color/black"
              android:background="@drawable/selectable_item"
              android:gravity="center"/>

    </LinearLayout>

    <LinearLayout
    android:layout_
    android:layout_
    android:layout_weight="1"
    android:orientation="vertical">

        <TextView android:id="@+id/text_3"
              android:text="Text 3"
              android:layout_
              android:layout_
              android:layout_weight="1"
              android:textColor="@android:color/black"
              android:background="@drawable/selectable_item"
              android:gravity="center"/>

        <TextView android:id="@+id/text_4"
              android:text="Text 4"
              android:layout_
              android:layout_
              android:layout_weight="1"
              android:textColor="@android:color/black"
              android:background="@drawable/selectable_item"
              android:gravity="center"/>

    </LinearLayout>

</LinearLayout>

activity_main.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/list_view"
    android:layout_
    android:layout_/>

selectable_item.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false">
        <color android:color="@android:color/transparent"/>
    </item>
    <item android:state_selected="true">
        <color android:color="@android:color/darker_gray"/>
    </item>
</selector>

【讨论】:

【参考方案2】:

您的意思是要进行多项选择吗?如果是这样,您可以设置 ListView 的android:choiceMode 属性。

【讨论】:

无需多选应用。一次选择一个列表项中的一个选项。选择一个选项后,它有一些任务要做。然后选择其他选项。 如果您不发布任何代码,我认为我无法帮助您。

以上是关于Android:自定义列表视图列表元素点击的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义View之上拉下拉列表 头部元素跟随 缩放平移效果的实现

滚动时更新自定义列表视图失败

列表项在android自定义列表视图中重复

Android - 自定义列表视图项始终位于左侧

Android listview - 获取自定义列表视图的文本

Android:从自定义列表视图中单击的按钮获取列表视图项目