机器人可检查列表视图 [英] android checkable listview

查看:127
本文介绍了机器人可检查列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在开发Android应用是新的。 我已经创建了自己的名单适配器,如下图所示,我想该列表是可检查的。我怎么有这样做,我的列表中包含的每一行的复选框?

 公共类listAvtivity扩展ListActivity {
私人LayoutInflater mInflater;
私人矢量< RowData>数据;
RowData次;
静态最终的String []标题=新的String [] {
        *新*苹果iPad的Wi​​-Fi无线(16GB),7触摸平板-2GB谷歌Android,
苹果iPad的Wi​​-Fi无线(16GB)罕用,苹果iPad的Wi​​-Fi无线(16GB)AppleCase};
静态最终的String []详细=新的String [] {
        1小时37米航运:$ 10.00,1小时39米运费:免费,58米6S航运:$ 10.00,59米30岁运费:$ 10.95};
//私人整数[] imgid = {
 // R.drawable.bsfimg,R.drawable.bsfimg4,R.drawable.bsfimg2,
 // R.drawable.bsfimg5
//};
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
mInflater =(LayoutInflater)getSystemService(
Activity.LAYOUT_INFLATER_SERVICE);
数据=新的矢量< RowData>();
的for(int i = 0; I< title.length;我++){
尝试 {
    次=新RowData(ⅰ,标题[I],详细[I]);
    }赶上(ParseException的E){
        e.printStackTrace();
   }
   data.add(RD);
}
   CustomAdapter适配器=新CustomAdapter(这一点,R.layout.list,
                                     R.id.title,数据);
   setListAdapter(适配器);
   getListView()setTextFilterEnabled(真)。
}
   公共无效onListItemClick(ListView的父,视图V,INT位置,
                                                                长ID){
   Toast.makeText(getApplicationContext(),你已经选择了
                    +(位置+ 1)+个项目,Toast.LENGTH_SHORT).show();
}
       私有类RowData {
       保护INT MID;
       保护字符串mTitle;
       保护字符串mDetail;
       RowData(INT ID,字符串名称,字符串细节){
       MID = ID;
       mTitle =称号;
       mDetail =细节;
    }
       @覆盖
       公共字符串的toString(){
               返回MID ++ mTitle ++ mDetail;
       }
}
  私有类CustomAdapter扩展ArrayAdapter< RowData> {
  公共CustomAdapter(上下文的背景下,INT资源,
                        INT textViewResourceId,名单,其中,RowData>对象){
 超(背景下,资源,textViewResourceId,对象);
}
      @覆盖
       公共查看getView(INT位置,查看convertView,ViewGroup中父){
       ViewHolder支架=无效;
       TextView的标题= NULL;
       TextView的细节= NULL;
       // ImageView的I11 = NULL;
       RowData rowData =的getItem(位置);
       如果(空== convertView){
            convertView = mInflater.inflate(R.layout.list,NULL);
            持有人=新ViewHolder(convertView);
            convertView.setTag(保持器);
 }
             支架=(ViewHolder)convertView.getTag();
             标题= holder.gettitle();
             itle.setText(rowData.mTitle);
             细节= holder.getdetail();
             detail.setText(rowData.mDetail);
             //i11=holder.getImage();
             //i11.setImageResource(imgid[rowData.mId]);
             返回convertView;
}
            私有类ViewHolder {
            私人查看MROW;
            私人TextView的标题= NULL;
            私人TextView的细节= NULL;
            //私人ImageView的I11 = NULL;
            公共ViewHolder(查看行){
            MROW =行;
 }
         公众的TextView的getTitle(){
             如果(空==标题){
                 标题=(TextView中)mRow.findViewById(R.id.title);
                }
            返回称号;
         }
         公众的TextView getdetail(){
             如果(空==细节){
                  细节=(TextView中)mRow.findViewById(R.id.detail);
                    }
           返回细节;
         }
        //公共ImageView的的getImage(){
          //如果(空== I11){
            // I11 =(ImageView的)mRow.findViewById(R.id.img);
              //}
                //返回I11;
        //}
     }
   }
}
 

解决方案

我喜欢卡洛斯·塞萨的解决方案,从他的著作50 Android的黑客。

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

 < XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT>

    <的ListView
        机器人:ID =@ + ID / favContainer
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT
        机器人:choiceMode =singleChoice/>

< / RelativeLayout的>
 

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

 包com.myproject;

进口的java.util.ArrayList;

进口com.myproject.R;
进口com.myproject.model.Package;
进口com.myproject.adapter.FavoritesPackageArrayAdapter;
进口com.myproject.utils.DatabaseHelper;

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

公共类FavoritesActivity扩展活动
{
    受保护的ListView列表;
    保护字符串selectedPackage;
    受保护的ArrayList<包装>包;
    保护FavoritesPackageArrayAdapter适配器;

    私人DatabaseHelper DB =新DatabaseHelper(本);

    @覆盖
    保护无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);

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

        包= db.getPackages();
        适配器=新FavoritesPackageArrayAdapter(这一点,-1,包);
        名单=(ListView控件)findViewById(R.id.favContainer);
        list.setAdapter(适配器);
    }

    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单)
    {
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

    公共无效调用onSelect(查看视图)
    {
        INT POS = list.getCheckedItemPosition();
        如果(ListView.INVALID_POSITION!= POS)
            selectedPackage = packages.get(POS).getId();
    }

}
 

我的ListView适配器(FavoritesPackageArrayAdapter.java)是很简单的:

 包com.myproject.adapter;

进口的java.util.List;

进口com.myproject.model.Package;
进口com.myproject.view.PackageView;

进口android.content.Context;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.ArrayAdapter;

公共类FavoritesPackageArrayAdapter扩展ArrayAdapter<包装>
{

    公共FavoritesPackageArrayAdapter(上下文的背景下,INT资源,列表和LT;包装>对象)
    {
        超(背景下,资源对象);
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup)
    {
        如果(convertView == NULL)
            convertView =新PackageView(的getContext());

        套餐包=的getItem(位置);
        PackageView packView =(PackageView)convertView;
        packView.setPackage(包);

        返回convertView;
    }

}
 

为了让列表项辨认,你认为必须实现可检查的接口。 我PackageView.java是这样的:

 包com.myproject.view;

进口的java.util.ArrayList;

进口com.myproject.R;
进口com.myproject.model.Package;
进口com.myproject.model.PackageEvent;

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

公共类PackageView扩展的LinearLayout实现辨认
{
    私人视图V;
    私人TextView的TV0;
    私人TextView的TV1;
    私人TextView的TV2;
    私人TextView的TV3;

    私人复选框testCheckBox;

    公共PackageView(上下文的背景下)
    {
        超(上下文);
        LayoutInflater充气= LayoutInflater.from(上下文);
        V = inflater.inflate(R.layout.favorites_package,这一点,真正的);
        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);

        //我没有复选框在我的布局,但如果我有:
        // testCheckBox =(复选框)v.findViewById(R.id.checkBoxId);
    }

    公共无效setPackage(包组)
    {
        在这里我设置包ID,日期和时间//我的自定义方法
        ...
    }

    私人布尔查= FALSE;

    @覆盖
    公共布尔器isChecked()
    {
        返回检查;
        //如果我在我的布局有复选框我可以
        //返回testCheckBox.checked();
    }

    @覆盖
    公共无效setChecked(布尔检查)
    {
        this.checked =检查;

        //既然我选择不复选框在我的布局,我改变背景颜色
        根据选中状态//
        如果(器isChecked())
            ...
        其他
            ...
        //如果我在我的布局有复选框我可以
        // testCheckBox.setChecked(选中);
    }

    @覆盖
    公共无效切换()
    {
        !检查=检查;
        //如果我在我的布局有复选框我可以
        //返回testCheckBox.toggle();
    }

}
 

最后每个项目(favorites_package.xml)的XML布局:

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =WRAP_CONTENT
    机器人:方向=垂直>

    <的TextView
        机器人:ID =@ + ID / favPackageId
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT/>

    <的LinearLayout
        机器人:ID =@ + ID / favTimeDateContainer
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:weightSum =1>

        <的TextView
            机器人:ID =@ + ID / favEventDate
            机器人:layout_width =0dp
            机器人:layout_height =match_parent
            机器人:layout_weight =0.5/>

        <的TextView
            机器人:ID =@ + ID / favEventAddres
            机器人:layout_width =0dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_weight =0.5/>
    < / LinearLayout中>


   <的TextView
       机器人:ID =@ + ID / favEventState
       机器人:layout_width =match_parent
       机器人:layout_height =WRAP_CONTENT/>

< / LinearLayout中>
 

如果你想有实际的复选框,在布局它的XML看起来应该是这样的:

 <复选框
       机器人:ID =@ + ID / checkBoxId
       机器人:layout_width =WRAP_CONTENT
       机器人:layout_height =WRAP_CONTENT
       机器人:可点击=假
       机器人:可聚焦=假
       机器人:focusableInTouchMode =FALSE/>
 

如果你离开复选框点击,你只能只能通过单击复选框本身进行检查。 另外,不要让你的布局点击,由于某种原因,它不具有可检查的接口工作。

I am quite new in developing android applications. I have created my own list adapter as show below and I want that list to be checkable. What do I have to do so that my list contains a checkbox for each row?

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;
        //}
     }
   } 
}

解决方案

I liked Carlos Sessa solution from his book "50 Android hacks".

my activity_favorites.xml looks like this:

<?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>

My FavoritesActivity.java looks like this:

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();
    }

}

My ListView adapter (FavoritesPackageArrayAdapter.java) is quite simple:

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;
    }

}

In order to have list items checkable, your view has to implement Checkable interface. My PackageView.java looks like:

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();
    }

}

And finally xml layout of each list item (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>

If you wanted to have actual checkbox in your layout it's xml should look something like:

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

If you left checkbox clickable, you could only check it only by clicking on checkbox itself. Also don't make your layout clickable, for some reason it doesn't work with Checkable interface.

这篇关于机器人可检查列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆