我对此感到困惑。我正在寻找超过2个小时,无法理解发生了什么。
我有一个Listview,我希望项目(行)可以选择。 为实现这一目标,我有一个选择器,我将其设置为行布局的背景。
ListView在fragment.xml布局文件中以这种方式定义:
<ListView
android:id="@+id/lst_friends"
android:layout_width="match_parent"
android:dividerHeight="1dp"
android:divider="#ff0000"
android:layout_height="0dp"
android:layout_weight="1.0" />
选择器( bg_row_contact.xml )是这样的:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" android:state_selected="false"/>
<item android:drawable="@color/pink" android:state_selected="true"/>
</selector>
我的行布局( row_contact.xml )是:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_row_contact"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="7dp"
android:gravity="center" >
<ImageView
android:id="@+id/img_lst"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/contentDescription_pic" />
</LinearLayout>
<TextView
android:id="@+id/txt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="20dp"
android:layout_marginLeft="10dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="#000000"
android:textSize="16sp" />
</LinearLayout>
现在,我有一个自定义适配器,我在其中执行此操作,以便在用户点击行时将项目标记为已选中,完美无缺:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// View from recycle
View row = convertView;
// Handle inflation and make sure not to re-use a header view
if (row == null) {
LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.row_contact, null);
row.setTag(position);
row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(!v.isSelected());
}
});
}
boolean condition = (position==3);
row.setSelected(condition);
}
我现在的问题是,我希望在滚动列表视图时显然保持选择状态。所以我有一个条件,我检查并将行设置为选择或不基于此,你可以在
中看到row.setSelected(boolean condition);
问题是虽然某些行的条件为真,但行的背景选择器不起作用且行没有高亮。
我已经尝试了一切,但是找不到这里发生的哔哔声。
有什么建议吗?
答案 0 :(得分:0)
我一直在玩一下,我想我找到了解决问题的方法。这个适用于list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
您可以通过list.getCheckedItemPositions()
获取所选项目。唯一奇怪的是,在您的选择器中,您必须使用android:state_activated
而不是android:state_checked
。
活动代码:
ListView list = (ListView) findViewById(R.id.listView);
// dummy values
final String[] values = new String[] { "a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "w", "x", "y", "z" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.row_contact, values){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// View from recycle
View row = convertView;
// Handle inflation and make sure not to re-use a header view
if (row == null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.row_contact, null);
row.setTag(position);
}
((TextView)row.findViewById(R.id.txt_title)).setText(values[position]);
return row;
}
};
list.setAdapter(adapter);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
选择器(bg_row_contact.xml)
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" android:state_activated="false"/>
<item android:drawable="@android:color/black" android:state_activated="true"/>
</selector>
希望这有帮助。