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

时间:2015-05-14 22:07:08

标签: android listview android-listview android-adapter custom-adapter

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

List item

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

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

这样下去了。

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

我现在应该怎么做。请建议我。

2 个答案:

答案 0 :(得分:0)

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

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_width="match_parent"
          android:layout_height="150dp"
          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_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:orientation="vertical">

        <TextView android:id="@+id/text_1"
              android:text="Text 1"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              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_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:textColor="@android:color/black"
              android:background="@drawable/selectable_item"
              android:gravity="center"/>

    </LinearLayout>

    <LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:orientation="vertical">

        <TextView android:id="@+id/text_3"
              android:text="Text 3"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              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_width="match_parent"
              android:layout_height="0dp"
              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_width="match_parent"
    android:layout_height="match_parent"/>

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>

答案 1 :(得分:0)

你的意思是你想做多个选择吗?如果是这样,您可以设置ListView的android:choiceMode属性。