2011-05-09 53 views
6

我在開發android應用程序方面很新穎。 我已經創建了我自己的列表適配器,如下所示,我希望列表可以被檢查。我必須做什麼以便我的列表包含每行的複選框?android checkable listview

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

回答

0

看那個代碼示例

http://www.androidpeople.com/android-listview-multiple-choice-example

---編輯 -

你不發表您的XML文件。要有一個自定義列表行,我這樣做了。首先我在你的java代碼中包含我的listview的setcontentview。

setContentView(R.layout.list_main); 

然後你list_main.xml文件應包含一個ListView

<ListView android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

之後設置數據適配器

setListAdapter(new YOUR_ADAPTER_CLASS(this, R.layout.list_item, YOUR_OBJECT)); 

爲了得到一個自定義列表項,創建一個包含一個list_item.xml文件您的自定義行。你可以在這裏放置線性佈局,圖像或複選框。

然後讓你的ListView

ListView listView = getListView(); 

您可以設置onitemclick這裏聽者

listView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
      //YOUR_CODE_HERE 
     } 
     }); 

然後在您的自定義適配器文件,你可以實現getview功能

@Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
      View view = convertView; 
      if (view == null) { 
       LayoutInflater layoutInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = layoutInflator.inflate(R.layout.list_item, null); 
      } 
      //YOU CAN GET EVERY OBJECT AND SET YOUR CUSTOM ROW like below 
      //view.findViewById(R.id.YOUR_OBJECT_ID_HERE); 
      return view; 
    } 

我不能看在你的代碼中說出什麼是錯誤的,但是這是實現li的自定義行的正確方法在android中stview。

+0

這是一個通用的例子。你能幫我一下嗎?在我的代碼 – Omran 2011-05-09 17:38:04

+0

中你必須改變你不應該發送代碼並詢問什麼是錯的。因爲我沒有項目,所以沒有查看它沒有工作的地方,如果存在錯誤,你沒有放置logcat內容。一般來說,只是把代碼,不工作,寫logcat錯誤的內容。 :)讓我們回到代碼。從你的xml獲取你的listview。並調用your_list_View_object_here.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); – 2011-05-09 22:12:22

+0

我做了你告訴我的,但仍然複選框沒有出現在列表項上 – Omran 2011-05-10 06:48:05

8

我喜歡他的書「50 Android hacks」中的Carlos Sessa解決方案。

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

} 

爲了讓列表項可選,您的視圖必須實現Checkable inte rface。 我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(); 
    } 

} 

最後每個列表項(favorites_package的XML佈局。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界面。

+1

onSelect(...)方法如何在這些類中工作? – 2015-12-01 09:53:31