gpt4 book ai didi

android 可检查 ListView

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:41 28 4
gpt4 key购买 nike

我在开发 Android 应用程序方面还很陌生。我创建了自己的列表适配器,如下所示,我希望该列表是可检查的。我必须怎么做才能使我的列表中的每一行都包含一个复选框?

public class listAvtivity extends ListActivity {
private LayoutInflater mInflater;
private Vector<RowData> data;
RowData rd;
static final String[] title = new String[] {
"*New*Apple iPad Wi-Fi (16GB)", "7 Touch Tablet -2GB Google Android",
"Apple iPad Wi-Fi (16GB) Rarely Used ","Apple iPad Wi-Fi (16GB) AppleCase" };
static final String[] detail = new String[] {
"1h 37m Shipping: $10.00","1h 39m Shipping: Free","58m 6s Shipping:$10.00","59m 30s Shipping: $10.95" };
//private Integer[] imgid = {
// R.drawable.bsfimg,R.drawable.bsfimg4,R.drawable.bsfimg2,
// R.drawable.bsfimg5
//};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mInflater = (LayoutInflater) getSystemService(
Activity.LAYOUT_INFLATER_SERVICE);
data = new Vector<RowData>();
for(int i=0;i<title.length;i++){
try {
rd = new RowData(i,title[i],detail[i]);
} catch (ParseException e) {
e.printStackTrace();
}
data.add(rd);
}
CustomAdapter adapter = new CustomAdapter(this, R.layout.list,
R.id.title, data);
setListAdapter(adapter);
getListView().setTextFilterEnabled(true);
}
public void onListItemClick(ListView parent, View v, int position,
long id) {
Toast.makeText(getApplicationContext(), "You have selected "
+(position+1)+"th item", Toast.LENGTH_SHORT).show();
}
private class RowData {
protected int mId;
protected String mTitle;
protected String mDetail;
RowData(int id,String title,String detail){
mId=id;
mTitle = title;
mDetail=detail;
}
@Override
public String toString() {
return mId+" "+mTitle+" "+mDetail;
}
}
private class CustomAdapter extends ArrayAdapter<RowData> {
public CustomAdapter(Context context, int resource,
int textViewResourceId, List<RowData> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
TextView title = null;
TextView detail = null;
//ImageView i11=null;
RowData rowData= getItem(position);
if(null == convertView){
convertView = mInflater.inflate(R.layout.list, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
title = holder.gettitle();
itle.setText(rowData.mTitle);
detail = holder.getdetail();
detail.setText(rowData.mDetail);
//i11=holder.getImage();
//i11.setImageResource(imgid[rowData.mId]);
return convertView;
}
private class ViewHolder {
private View mRow;
private TextView title = null;
private TextView detail = null;
//private ImageView i11=null;
public ViewHolder(View row) {
mRow = row;
}
public TextView gettitle() {
if(null == title){
title = (TextView) mRow.findViewById(R.id.title);
}
return title;
}
public TextView getdetail() {
if(null == detail){
detail = (TextView) mRow.findViewById(R.id.detail);
}
return detail;
}
//public ImageView getImage() {
// if(null == i11){
// i11 = (ImageView) mRow.findViewById(R.id.img);
// }
//return i11;
//}
}
}
}

最佳答案

我喜欢 Carlos Sessa 在他的书“50 Android hacks”中的解决方案。

我的 activity_favorites.xml 看起来像这样:

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

<ListView
android:id="@+id/favContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:choiceMode="singleChoice"/>

</RelativeLayout>

我的 FavoritesActivity.java 看起来像这样:

package com.myproject;

import java.util.ArrayList;

import com.myproject.R;
import com.myproject.model.Package;
import com.myproject.adapter.FavoritesPackageArrayAdapter;
import com.myproject.utils.DatabaseHelper;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.ListView;

public class FavoritesActivity extends Activity
{
protected ListView list;
protected String selectedPackage;
protected ArrayList<Package> packages;
protected FavoritesPackageArrayAdapter adapter;

private DatabaseHelper db = new DatabaseHelper(this);

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_favorites);

packages = db.getPackages();
adapter = new FavoritesPackageArrayAdapter(this, -1, packages);
list = (ListView) findViewById(R.id.favContainer);
list.setAdapter(adapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

public void onSelect(View view)
{
int pos = list.getCheckedItemPosition();
if(ListView.INVALID_POSITION != pos)
selectedPackage = packages.get(pos).getId();
}

}

我的 ListView 适配器 (FavoritesPackageArrayAdapter.java) 非常简单:

package com.myproject.adapter;

import java.util.List;

import com.myproject.model.Package;
import com.myproject.view.PackageView;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class FavoritesPackageArrayAdapter extends ArrayAdapter<Package>
{

public FavoritesPackageArrayAdapter(Context context, int resource, List<Package> objects)
{
super(context, resource, objects);
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
convertView = new PackageView(getContext());

Package pack = getItem(position);
PackageView packView = (PackageView) convertView;
packView.setPackage(pack);

return convertView;
}

}

为了使列表项可检查,您的 View 必须实现 Checkable 接口(interface)。我的 PackageView.java 看起来像:

package com.myproject.view;

import java.util.ArrayList;

import com.myproject.R;
import com.myproject.model.Package;
import com.myproject.model.PackageEvent;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Checkable;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.CheckBox;

public class PackageView extends LinearLayout implements Checkable
{
private View v;
private TextView tv0;
private TextView tv1;
private TextView tv2;
private TextView tv3;

private CheckBox testCheckBox;

public PackageView(Context context)
{
super(context);
LayoutInflater inflater = LayoutInflater.from(context);
v = inflater.inflate(R.layout.favorites_package, this, true);
tv0 = (TextView) v.findViewById(R.id.favPackageId);
tv1 = (TextView) v.findViewById(R.id.favEventDate);
tv2 = (TextView) v.findViewById(R.id.favEventAddres);
tv3 = (TextView) v.findViewById(R.id.favEventState);

// I don't have checkbox in my layout, but if I had:
// testCheckBox = (CheckBox) v.findViewById(R.id.checkBoxId);
}

public void setPackage(Package pack)
{
// my custom method where I set package id, date, and time
...
}

private Boolean checked = false;

@Override
public boolean isChecked()
{
return checked;
// if I had checkbox in my layout I could
// return testCheckBox.checked();
}

@Override
public void setChecked(boolean checked)
{
this.checked = checked;

// since I choose not to have check box in my layout, I change background color
// according to checked state
if(isChecked())
...
else
...
// if I had checkbox in my layout I could
// testCheckBox.setChecked(checked);
}

@Override
public void toggle()
{
checked = !checked;
// if I had checkbox in my layout I could
// return testCheckBox.toggle();
}

}

最后是每个列表项的 xml 布局 (favorites_package.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/favPackageId"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<LinearLayout
android:id="@+id/favTimeDateContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="1">

<TextView
android:id="@+id/favEventDate"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"/>

<TextView
android:id="@+id/favEventAddres"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"/>
</LinearLayout>


<TextView
android:id="@+id/favEventState"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

</LinearLayout>

如果你想在你的布局中有实际的复选框,它的 xml 应该是这样的:

<CheckBox
android:id="@+id/checkBoxId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"/>

如果你让复选框可以点击,你只能通过点击复选框本身来检查它。也不要让您的布局可点击,因为某些原因它不适用于 Checkable 界面。

关于android 可检查 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5939392/

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