androidstudio4 实现ListView单选、多选效果最实用案例 亲试可用
前言
用androidstudio写一个快递用的APP,里面要用到多选和单选,发现ListView原生就有多选和单选的功能。
一、无图无真像,先上图
二、使用步骤
要有选中效果,要在ListView的布局中设置android:choiceMode属性,item布局实现checkable。
mainActivity代码:
/**
* @author ganggang
* @date 2020/11/18
* @desc 多选代码
*/
public class MainActivity extends AppCompatActivity {
private ListView mSingleListView;
private ListView mMultipleListView;
private ArrayList<String> mTestData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSingleListView = (ListView) findViewById(R.id.lv_singleChoice);
mMultipleListView = (ListView) findViewById(R.id.lv_multipleChoice);
mSingleListView.setAdapter(new ArrayAdapter<String>(this, R.layout.item_lv_single_choice, initData()));
mMultipleListView.setAdapter(new CustomAdapter());
mSingleListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int checkedItemPosition = mSingleListView.getCheckedItemPosition();
Toast.makeText(MainActivity.this, "you chose item " + checkedItemPosition, Toast.LENGTH_SHORT).show();
}
});
mMultipleListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SparseBooleanArray checkedItemPositions = mMultipleListView.getCheckedItemPositions();
boolean isChecked = checkedItemPositions.get(position);
Toast.makeText(MainActivity.this, "item " + position + " isChecked=" + isChecked, Toast.LENGTH_SHORT).show();
}
});
}
private ArrayList<String> initData() {
mTestData = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
mTestData.add("我加的测试数据"+i);
}
return mTestData;
}
private class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return mTestData.size();
}
@Override
public String getItem(int position) {
return mTestData.get(position);
}
@Override
public long getItemId(int position) {
return mTestData.get(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup container) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_lv_multiple_choice, container, false);
}
((TextView) convertView.findViewById(R.id.tv_content))
.setText(getItem(position));
return convertView;
}
}
}
CheckableLayout:
/**
* @author ganggang
* @date 2020/11/18
* @desc 多选代码
*/
public class CheckableLayout extends RelativeLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
private boolean mChecked;
public CheckableLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setChecked(boolean b) {
if (b != mChecked){
mChecked = b;
refreshDrawableState();
}
}
@Override
public boolean isChecked() {
return mChecked;
}
@Override
public void toggle() {
setChecked(!mChecked);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) mergeDrawableStates(drawableState, CHECKED_STATE_SET);
return drawableState;
}
}
布局代码:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.jm.customchoicelist.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:text="ListView 单选模式例子2.0" />
<ListView
android:id="@+id/lv_singleChoice"
android:layout_width="match_parent"
android:layout_height="180dp"
android:choiceMode="singleChoice"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:text="ListView 多选模式例子2.0" />
<ListView
android:id="@+id/lv_multipleChoice"
android:layout_width="match_parent"
android:layout_height="220dp"
android:choiceMode="multipleChoice"/>
</LinearLayout>
choice.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.jm.customchoicelist.CheckableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:textColor="@color/hideable_text_color"
tools:text="测试数据"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="20dp"
android:src="@drawable/ic_hideable_item"/>
</com.jm.customchoicelist.CheckableLayout>
single_choice.xml:
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_single_choice"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:textSize="14sp"
android:gravity="center_vertical"
android:checkMark="?android:listChoiceIndicatorSingle"
android:paddingLeft="16dp"
android:paddingRight="16dp">
</CheckedTextView>
案例源码下载:
本文源码下载
总结
使用原生功能做实用,代码高效。
转载请注明出处,谢谢