2012-05-07 6 views
2

Я хочу создать список, как показано ниже.android Несколько выбора ListView & Textview

checkbox | Текстовое изображение | Текстовое изображение | Текстовое изображение | Текстовое изображение | Текстовое изображение | Текстовое изображение |

все данные поступают из базы данных и устанавливаются в текстовом виде.

я пытался, но я получил некоторые проблемы

  1. когда я установите флажок и список прокрутки, то его автоматически uncheked.

  2. если я выбираю первый флажок, то 5-й проверяется автоматически.

  3. проверить все & снимите флажок все

пожалуйста, помогите мне, я пробовал много кода, но я не успех.

благодарит заранее.

+0

2 проблема возникает bcz android os автоматически переназначает состояние флажка, поэтому вам необходимо поддерживать состояния флажка в arraylist и явно переназначить его на bindView() методе –

ответ

5

это может вам помочь.

package com.Sample_MultipleSelection; 

import java.util.ArrayList; 

import android.R.integer; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Context; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.TextView; 

public class Sample_MultipleSelectionActivity extends ListActivity { 

    private MyListAdapter adapter; 
    ArrayList<String> item_id = new ArrayList<String>(); 
    ArrayList<String> item_name = new ArrayList<String>(); 
    ArrayList<String> item_balance = new ArrayList<String>(); 
    ArrayList<String> item_email = new ArrayList<String>(); 

    ArrayList<String> items = new ArrayList<String>(); 

    private CheckBox chk_main; 
    boolean flag = false; 
    boolean[] selection; 
    ArrayList<String> selection_val; 
    private Button btn_select; 
    private CheckBox chk_select; 
    ViewHolder holder12; 
    boolean select_all; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     item_id.add("1"); 
     item_name.add("China"); 
     item_balance.add("4000"); 
     item_email.add("[email protected]"); 

     item_id.add("2"); 
     item_name.add("abc"); 
     item_balance.add("4000"); 
     item_email.add("[email protected]"); 

     item_id.add("3"); 
     item_name.add("xyz"); 
     item_balance.add("4000"); 
     item_email.add("[email protected]"); 

     item_id.add("4"); 
     item_name.add("xyza"); 
     item_balance.add("40070"); 
     item_email.add("[email protected]"); 

     item_id.add("5"); 
     item_name.add("xyzc"); 
     item_balance.add("1000"); 
     item_email.add("[email protected]"); 

     final ViewHolder holder = new ViewHolder(); 
     selection = new boolean[item_id.size()]; 
     selection_val = new ArrayList<String>(); 

     adapter = new MyListAdapter(this); 
     setListAdapter(adapter); 

     holder12 = new ViewHolder(); 


     btn_select = (Button) findViewById(R.id.button1); 
     btn_select.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

       int len = selection.length; 
       int cnt = 0; 
       String selectIds = ""; 
       for (int i = 0; i < len; i++) { 
        if (selection[i]) { 
         cnt++; 
        } 
       } 
       for (int i = 0; i < selection_val.size(); i++) { 
        selectIds = selectIds + " | " + selection_val.get(i); 
       } 
       if (cnt == 0) { 
        Toast.makeText(getApplicationContext(), "NO Selection", 1) 
          .show(); 
       } else { 
        Toast.makeText(
          getApplicationContext(), 
          "Your are Selected " + cnt + " ids. " + " " 
            + selectIds, 1).show(); 
       } 
      } 
     }); 
    } 

    public class MyListAdapter extends BaseAdapter { 
     Context con; 
     private LayoutInflater layoutinf; 
     ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
     ArrayList<String> items_ = new ArrayList<String>(); 

     public MyListAdapter(
       Sample_MultipleSelectionActivity sample_MultipleSelectionActivity) { 
      con = sample_MultipleSelectionActivity; 
     } 

     public int getCount() { 
      return item_id.size(); 
     } 

     public Object getItem(int arg0) { 
      return item_id.size(); 
     } 

     public long getItemId(int arg0) { 
      return item_id.get(arg0).hashCode(); 
     } 

     public View getView(final int arg0, View arg1, ViewGroup arg2) { 

      View v = arg1; 
      ViewHolder holder = null; 
      if (v == null) { 
       layoutinf = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = layoutinf.inflate(R.layout.row, null); 
       holder = new ViewHolder(); 
       holder.chk = (CheckBox) v.findViewById(R.id.checkBox1); 
       holder.tv_name = (TextView) v.findViewById(R.id.textView1); 
       holder.tv_bal = (TextView) v.findViewById(R.id.textView2); 
       holder.tv_email = (TextView) v.findViewById(R.id.textView3); 

       v.setTag(holder); 
      } else { 
       holder = (ViewHolder) v.getTag(); 
      } 

      holder.chk.setId(arg0); 
      holder.tv_name.setId(arg0); 

      holder.chk.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        try { 
         CheckBox cb = (CheckBox) v; 
         int id = cb.getId(); 
         String val = cb.getText().toString(); 
         if (selection[id]) { 
          cb.setChecked(false); 
          selection[id] = false; 
          selection_val.remove("" + val); 
         } else { 
          cb.setChecked(true); 
          selection[id] = true; 
          selection_val.add("" + val); 
         } 
         adapter.notifyDataSetChanged(); 
        } catch (Exception e) { 
         Log.e("error", "" + e.toString()); 
        } 
       } 
      }); 
      holder.chk.setChecked(selection[arg0]); 

      if(selection[arg0] == true) 
      { 
       holder.tv_name.setBackgroundColor(Color.GRAY); 
       holder.tv_bal.setBackgroundColor(Color.GRAY); 
       holder.tv_email.setBackgroundColor(Color.GRAY); 
      } 
      else 
      { 
       holder.tv_name.setBackgroundColor(Color.TRANSPARENT); 
       holder.tv_bal.setBackgroundColor(Color.TRANSPARENT); 
       holder.tv_email.setBackgroundColor(Color.TRANSPARENT); 
      } 

      holder.chk.setText(item_id.get(arg0)); 
      holder.tv_name.setText("" + item_name.get(arg0)); 
      holder.tv_bal.setText(item_balance.get(arg0)); 
      holder.tv_email.setText(item_email.get(arg0)); 

      return v; 
     } 
    } 

    public class ViewHolder { 
     private CheckBox chk; 
     private TextView tv_name; 
     private TextView tv_bal; 
     private TextView tv_email; 

    } 
} 

main.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="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <CheckBox 
      android:id="@+id/chk_main" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:focusable="false" 

      android:text="" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:text="Name" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="#66cc33" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:text="Balance" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="#66cc33" /> 

     <TextView 
      android:id="@+id/textView3" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:text="Email-Id" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="#66cc33" /> 
    </LinearLayout> 

    <View 
     android:id="@+id/view1" 
     android:layout_width="wrap_content" 
     android:layout_height="2dp" 
     android:background="#fff" /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="314dp" 
     android:layout_weight="1" > 
    </ListView> 

    <Button 
     android:id="@+id/button1" 
     android:focusable="false" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="select" /> 

    </LinearLayout> 

row.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="horizontal"> 


         <CheckBox 
          android:id="@+id/checkBox1" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content"        
          android:textColor="#000" /> 



         <TextView 
          android:id="@+id/textView1" 
          android:layout_width="100dp" 
          android:layout_height="wrap_content"       
          android:padding="3dp" 
          android:textAppearance="?android:attr/textAppearanceMedium" /> 

         <TextView 
          android:padding="3dp" 
          android:id="@+id/textView2" 
          android:layout_width="100dp" 
          android:layout_height="wrap_content"       
          android:textAppearance="?android:attr/textAppearanceMedium" /> 

         <TextView 
          android:padding="3dp" 
          android:id="@+id/textView3" 
          android:layout_width="100dp" 
          android:layout_height="wrap_content"       
          android:textAppearance="?android:attr/textAppearanceMedium" /> 

    </LinearLayout> 

сделать это правильно, что, если он правильно.

+0

большое спасибо. –

1

Это происходит потому, что когда вы просматриваете список, он фактически повторно использует строки для отображения информации. Это значительно улучшает производительность прокрутки по длинным спискам.

Но это в стороне, давайте исправьте его. То, что вам нужно сделать, это инициировать событие, когда флажок установлен, поэтому значение может быть сохранено в массиве, наиболее подходящим для остальной информации списка, чтобы при повторном просмотре значение можно было восстановить, а также как правильно очистить проверенное состояние при повторном использовании представления.

Это может быть сделано внутри метода getView() в вашем пользовательском ArrayAdapter.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    if(row == null) { 
     LayoutInflater inflater = LayoutInflater.from(this.getContext()); 
     row = inflater.inflate(R.layout.category_color, parent, false); 
    } 

    if(this.getCount() > position) { 
     DataObject data = this.getItem(position); 
     CheckBox checkbox = (CheckBox)row.findViewById(R.id.checkbox); 
     checkbox.setChecked(data.isChecked()); 
     checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       data.setChecked(isChecked); 
      }}); 
     ... 
    } 

    return(row); 
} 
+0

, можете ли вы это подробно объяснить. или предоставить мне код, если хотите. –

+0

Dhaval, я предоставил почти весь код, который вам нужен. О чем вы не уверены? Если вам нужна дополнительная информация о том, как использовать ArrayAdapters для ListView, прочитайте это: http://www.ezzylearning.com/tutorial.aspx?tid=1763429&q=customizing-android-listview-items-with-custom-arrayadapter – Scott

0

Это потому, что каждый раз, когда вы просматриваете свой список, он воссоздает свою строку и устанавливает ее значение по умолчанию или какое-то время любое значение. Поэтому из-за этого он не работает. Я уже ответил на подобный вопрос уже 2-3 раза. Here - это решение.

Смежные вопросы