gpt4 book ai didi

android - 使用 CAB 在自定义 ListView 中进行多项选择

转载 作者:IT老高 更新时间:2023-10-28 21:54:41 27 4
gpt4 key购买 nike

在阅读并尝试了几天后,我放弃并寻求帮助。

<编辑>我正在使用 ActionBarSherlock。

我想要达到的目标:每行都有一个自定义布局的 ListView,用户可以在其中选择多个列表项。选定的列表项应具有不同的背景颜色。当至少选择了一项时,应显示上下文操作栏 (CAB)。它应该看起来或多或少像 GMail 应用程序中的多个电子邮件选择。唯一的区别是,在 gmail 应用程序中,选择是通过单击一行的复选框来完成的,而我不想有一个复选框,但是无论用户点击哪里,都应该选择一行。 Multiple selection in GMail app

我尝试了什么:关注 this tutorial ,使用带有一些逻辑的 Checkable 行布局来在切换检查状态时更改背景颜色,除了我无法在 ListView 上注册像 OnItemClickListener 这样的单击监听器以显示 CAB 之外,我得到了一切工作。为每一行 View 提供单击监听器都没有帮助,因为这阻止了更改所选项目的背景颜色。我也尝试像这样向 ListView 添加一个 MultiChoiceModeListener

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { //.. });

结果相同,背景颜色没有变化。

我在寻找什么:如何做到这一点的提示或教程或示例代码。如果您需要一些代码 fragment 来提供帮助,请告诉我。

最佳答案

看看代码是否对你有帮助(它基本上是一个 ListActivity 带有一个自定义适配器来保存检查项目的状态(+不同的背景)):

public class CABSelection extends ListActivity {

private ArrayList<String> mItems = new ArrayList<String>();
private SelectionAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for (int i = 0; i < 24; i++) {
mItems.add("Name" + i);
}
// R.layout.adapters_cabselection_row is a LinearLayout(with green
// background(#99cc00)) that wraps an ImageView and a TextView
mAdapter = new SelectionAdapter(this,
R.layout.adapters_cabselection_row, R.id.the_text, mItems);
setListAdapter(mAdapter);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() {

private int nr = 0;

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.cabselection_menu, menu);
return true;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
StringBuilder sb = new StringBuilder();
Set<Integer> positions = mAdapter.getCurrentCheckedPosition();
for (Integer pos : positions) {
sb.append(" " + pos + ",");
}
switch (item.getItemId()) {
case R.id.edit_entry:
Toast.makeText(CABSelection.this, "Edited entries: " + sb.toString(),
Toast.LENGTH_SHORT).show();
break;
case R.id.delete_entry:
Toast.makeText(CABSelection.this, "Deleted entries : " + sb.toString(),
Toast.LENGTH_SHORT).show();
break;
case R.id.finish_it:
nr = 0;
mAdapter.clearSelection();
Toast.makeText(CABSelection.this, "Finish the CAB!",
Toast.LENGTH_SHORT).show();
mode.finish();
}
return false;
}

@Override
public void onDestroyActionMode(ActionMode mode) {
nr = 0;
mAdapter.clearSelection();
}

@Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
if (checked) {
nr++;
mAdapter.setNewSelection(position, checked);
} else {
nr--;
mAdapter.removeSelection(position);
}
mode.setTitle(nr + " rows selected!");

}

});
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
l.setItemChecked(position, !mAdapter.isPositionChecked(position));
}

private class SelectionAdapter extends ArrayAdapter<String> {

private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();

public SelectionAdapter(Context context, int resource,
int textViewResourceId, List<String> objects) {
super(context, resource, textViewResourceId, objects);
}

public void setNewSelection(int position, boolean value) {
mSelection.put(position, value);
notifyDataSetChanged();
}

public boolean isPositionChecked(int position) {
Boolean result = mSelection.get(position);
return result == null ? false : result;
}

public Set<Integer> getCurrentCheckedPosition() {
return mSelection.keySet();
}

public void removeSelection(int position) {
mSelection.remove(position);
notifyDataSetChanged();
}

public void clearSelection() {
mSelection = new HashMap<Integer, Boolean>();
notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views
v.setBackgroundColor(Color.parseColor("#99cc00")); //default color
if (mSelection.get(position) != null) {
v.setBackgroundColor(Color.RED);// this is a selected position so make it red
}
return v;
}

}

}

R.layout.adapters_cabselection_row 是行的自定义布局(非常简单),背景为绿色:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99cc00" >

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />

<TextView
android:id="@+id/the_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="17sp"
android:textStyle="bold" />

</LinearLayout>

R.menu.cabselection_menu 是一个带有 3 个选项(编辑、删除、完成 CAB)的菜单文件,除了弹出带有关于所选行的消息:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:id="@+id/edit_entry"
android:icon="@android:drawable/ic_menu_edit"
android:title="Edit!"/>
<item
android:id="@+id/delete_entry"
android:icon="@android:drawable/ic_menu_delete"
android:title="Delete!"/>
<item
android:id="@+id/finish_it"
android:icon="@android:drawable/ic_menu_crop"
android:title="Get me out!"/>

</menu>

关于android - 使用 CAB 在自定义 ListView 中进行多项选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com