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之上拉下拉列表 头部元素跟随 缩放平移效果的实现