我正在为列表视图开发一个带有自定义适配器的应用程序,其中数据来自服务器。自定义适配器由图像视图至少两个组成,最多四个依赖于来自服务器的数据。如图所示。
根据功能,每个图像视图都具有点击监听器。
问题是当我点击列表第一个项目 - 第一个图像视图时,它会被选中,但是当我点击列表第二个项目 - 第二个图像视图时,这个项目选择会发生变化。第一个项目的选择从第一个图像视图更改为第二个。
这样下去了。
我也试过notifydatasetchange(),因为我的数据存储在列表视图中,并且我在选择列表视图中保存所选项目图像视图编号。
我现在应该怎么做。请建议我。
答案 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
属性。