需要有关Android自定义ListView的点击监听器的帮助

时间:2011-08-25 16:13:53

标签: android listview

我的应用程序有自定义ListView,每行包含复选框,编辑文本和2个按钮。在主xml布局文件中,我有1个提交按钮和listView。我想要,当我点击提交按钮,我应该得到所有检查行位置。我是Android编程的新手,所以PLZ帮助我我的代码不工作在这里是我的代码:

main.xml中

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button android:layout_height="wrap_content" 
android:text="@string/button_submit" 
android:layout_width="wrap_content" 
android:id="@+id/main_submit_button" android:onClick="@string/button_submit"></Button>

<ListView
android:id="@+id/list_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

</LinearLayout>

items.xml

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


<LinearLayout android:layout_height="wrap_content"
  android:layout_width="fill_parent">

  <TextView 
  android:layout_height="wrap_content"
  android:layout_width="fill_parent" android:layout_weight="1"
  android:id="@+id/items_name" 
  android:gravity="left"
  android:textStyle="bold" />

  <CheckBox android:id="@+id/items_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right"
         />

</LinearLayout>


 <LinearLayout android:layout_height="wrap_content"
  android:layout_width="fill_parent">

  <Button android:id="@+id/items_add_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:gravity="left"
    android:text="@string/text_switcher_plus" />

   <EditText android:digits="10" 
   android:textStyle="bold" android:gravity="left" 
   android:id="@+id/items_plates" android:layout_height="wrap_content" 
   android:layout_width="90dp"></EditText>


  <Button  android:layout_height="wrap_content"         
    android:layout_width="wrap_content"  
    android:id="@+id/items_minus_button"
    android:text="@string/text_switcher_minus"
    android:gravity="right"
    />


     </LinearLayout>

 </LinearLayout>

VegmenuActivity

package com.sagar.resmenu;

import java.util.ArrayList;
import java.util.Arrays;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;

  // reference:http://pareshnmayani.wordpress.com/tag/android-custom-listview-example
  public class VegmenuActivity extends Activity implements OnItemClickListener{

 //dynamic array that contains names of items
   private ArrayList<String> items = new ArrayList<String>
   (Arrays.asList("Veg pulav", "Pav bhaji", "Panir tikka", "veg kolhapuri",
           "Coconut Rice", "Curd rice", "Mint Pulao",
                         "Banana  Custard","Basundi", "Cheese potato Tikkis",
                          "Dum aloo"));

   private ArrayList<Integer> counter = new ArrayList<Integer>
                        (Arrays.asList(0, 0,0, 0, 0,0, 0,0, 0,0,0));

   private SparseBooleanArray a;

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

    setContentView(R.layout.main);
    final ListView lv =(ListView)findViewById(R.id.list_view);
  //  lv.setOnClickListener(null);
    MyAdapter adapter = new MyAdapter(getApplicationContext(),items,counter);
    lv.setAdapter(adapter);
    lv.setItemsCanFocus(false);    
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    Button submit1;
    submit1 = (Button)findViewById(R.id.main_submit_button);
    submit1.setOnClickListener(new OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
        a = new SparseBooleanArray();
        a.clear();
        a = lv.getCheckedItemPositions();
        int len = items.size();

        for (int i = 0; i < len; i++)
        {


            if(a.valueAt(i) == true)
                Log.d("Returned ", String.valueOf(a.valueAt(i)));

         }                
      }
    }); 

   }    

  //private OnItemClickListener selectCat = new OnItemClickListener();
   public void onItemClick(AdapterView<?> a, View v, int positon, long id) {
    // TODO Auto-generated method stub
          } 

  }

MyAdapter.java

 package com.sagar.resmenu;

 import java.util.ArrayList;

 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
 import android.widget.BaseAdapter;
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.TextSwitcher;
 import android.widget.TextView;

public class MyAdapter extends BaseAdapter implements OnClickListener{
  private LayoutInflater inflater;
  private ArrayList<String>  data;
  VegmenuActivity m;
  private ArrayList<Integer> counter;

 public MyAdapter(Context context, ArrayList<String> data,ArrayList<Integer> counter) {
    // TODO Auto-generated constructor stub
   super();
  // Caches the LayoutInflater for quicker use
   this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  // Sets the events data
   this.data= data;
  this.counter=counter;   
  }


 public int getCount() {
    return this.data.size();
//return this.counter.size();
  }

  public String getItem(int position) throws IndexOutOfBoundsException{
    return null;
  }

  public long getItemId(int position) throws IndexOutOfBoundsException{
    return 0;
  }

  public int getViewTypeCount(){
    return 1;
  }

  public static class ViewHolder   
    { 


        TextView items_name;

        CheckBox items_check ;
        Button items_plus_button;
        Button items_minus_button;
        EditText plates;
    }


  public View getView(int position, View convertView, ViewGroup parent){
     //String myText = getItem(position);          
     ViewHolder holder;
     if(convertView == null){ // If the View is not cached
        // Inflates the Common View from XML file
         holder = new ViewHolder();
        convertView = this.inflater.inflate(R.layout.items,parent,false);

        holder.items_name = (TextView) convertView.findViewById(R.id.items_name);
        holder.plates = (EditText) convertView.findViewById(R.id.items_plates);
        holder.items_check = (CheckBox) convertView.findViewById(R.id.items_check);      

       convertView.setTag(holder);

                }

                else           
                 holder=(ViewHolder)convertView.getTag();       

                 holder.items_name.setText(data.get(position));
                 holder.plates.setText(String.valueOf(counter.get(position)));
                return convertView;
     }    

 @Override
 public void onClick(View arg0) {
    // TODO Auto-generated method stub

 }  

 }

2 个答案:

答案 0 :(得分:0)

可能是你的getItem和getItemId只返回null和1吗?我相信这些方法需要返回正确的数据才能工作。 getItem需要是:

String getItem(int position)
{
     return data.get(position);
}

和getItemId只返回位置而不是0:

String getItemId(int position)
{
     return position;
}

答案 1 :(得分:0)

当我需要listview中的复选框时,我经常编写如下代码:

MyAdapter.java:

- Declare an boolean array to mark which item is checked/unchecked:

    ....
    boolean[] checked;
    ...

inside constructor: 

    checked = new boolean[data.size()];

- Inside getView() 

    {


   .....

    holder.items_check.setChecked(checked[position]);
    holder.items_check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        checked[position] = isChecked;              
      }
    });
    .....
- And method to get all checked items:
boolean[] getCheckedItems() {
   return checked;
}

那是!