簡體   English   中英

滾動后,自定義ListView始終未選中

[英]Custom ListView always gets unchecked after scrolling over

我創建了一個應用程序正在使用自定義ListView 在自定義中, ListView具有Checkbox選項。 當我在電話屏幕上向上或向下滾動時,Checkbox自動取消選中。 你對這個案子有什么解決方案嗎? 請幫忙解決這個問題。 謝謝!

customelist.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".menu_list">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textViewItemName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginStart="10dp"
        android:layout_toEndOf="@+id/buttonBarcode"
        android:fontFamily="serif"
        android:text="Medium Text"
        android:textColor="@android:color/holo_red_dark"
        android:textSize="18sp"
        android:textStyle="bold" />


    <CheckBox
        android:id="@+id/checkboxList"
        android:layout_width="32dp"
        android:layout_height="30dp"
        android:layout_alignParentEnd="true"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="30dp"
        android:background="@drawable/button_round_green"
        android:textAlignment="center"
        android:textColorHint="@android:color/holo_red_dark"
        android:textColorLink="@android:color/holo_red_dark" />

</RelativeLayout>
</RelativeLayout>

ListAdapter.java

public class listAdapter extends ArrayAdapter<String> {

private final Activity context;
private final String[] index_item;
private final String[] barcode_food;
private final String[] item_name;
private final String[] price_item;

//private TextView textView_name, textView_price;
//private Button button_index, button_barcode;
//private CheckBox checkBoxItem;

public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
    super(context, R.layout.activity_menu_list, index_item);

    this.context = context;
    this.index_item = index_item;
    this.barcode_food = barcode_food;
    this.item_name = item_name;
    this.price_item = price_item;
}

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

    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);

    TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);

    final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);

    textView_name.setText(item_name[position]);

    // Row View got click
    rowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (checkBoxItem.isChecked()==true){
                checkBoxItem.setChecked(false);

            }
            else checkBoxItem.setChecked(true);
        }
    });



    // Return row view
    return rowView;
}

你需要修改像:

private final Activity context;
private final String[] index_item;
private final String[] barcode_food;
private final String[] item_name;
private final String[] price_item;
//add Array 
private final String[] selectedItems;

//private TextView textView_name, textView_price;
//private Button button_index, button_barcode;
//private CheckBox checkBoxItem;

public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
    super(context, R.layout.activity_menu_list, index_item);

    this.context = context;
    this.index_item = index_item;
    this.barcode_food = barcode_food;
    this.item_name = item_name;
    this.price_item = price_item;

     // Loop to set all the items are unselected
     for(int i=0;i<index_item.lenght();i++){
        selectedItems[i] = false;
      }
}

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

    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);

    TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);

    final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);

    textView_name.setText(item_name[position]);

if (selectedItems[position]){
                checkBoxItem.setChecked(true);

            }
            else checkBoxItem.setChecked(false);

    // Row View got click
    rowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(selectedItems[position]){
                selectedItems[position]= false;
            }else{
                 selectedItems[position]= true;
            }
            notifydatasetchanged
        }
    });



    // Return row view
    return rowView;
}

您必須維護Checkbox陣列選擇如下所示:

private final Boolean [] buttonCheckedState;

你的構造函數應該是這樣的:

public listAdapter(Activity context,String [] index_item,String [] barcode_food,String [] item_name,String [] price_item){

super(context, R.layout.activity_menu_list, index_item);

this.context = context;
this.index_item = index_item;
this.barcode_food = barcode_food;
this.item_name = item_name;
this.price_item = price_item;
for(int i=0;i<index_item.lenght();i++){
    buttonCheckedState[i] = false;
  }

}

將此代碼放入get View:

checkBoxItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                buttonCheckedState[position]=buttonView.isChecked(); // Set the value of checkbox to maintain its state.
            }
        });


    checkBoxItem .setTag(position); // This line is important. 
   checkBoxItem.setChecked(buttonCheckedState[position]);

像這樣的東西

    private final Activity context;
    private final String[] index_item;
    private final String[] barcode_food;
    private final String[] item_name;
    private final String[] price_item;
    private boolean[] checkboxes;

    //private TextView textView_name, textView_price;
    //private Button button_index, button_barcode;
    //private CheckBox checkBoxItem;

    public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
        super(context, R.layout.activity_menu_list, index_item);

        this.context = context;
        this.index_item = index_item;
        this.barcode_food = barcode_food;
        this.item_name = item_name;
        this.price_item = price_item;
        this.checkboxes = new boolean[index_item.length];
        for(i = 0; i < checkboxes.length; i++)
             checkboxes[i] = false;
    }

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

        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);

        TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);

        final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);

        textView_name.setText(item_name[position]);
        checkBoxItem.setChecked(checkboxes[position]);
        // Row View got click
        rowView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 checkboxes[position] = !checkboxes[position];
                 checkBoxItem.setChecked(checkboxes[position]);
                /*if (checkBoxItem.isChecked()==true){
                    checkBoxItem.setChecked(false);

                }
                else checkBoxItem.setChecked(true);*/
            }
        });



        // Return row view
        return rowView;
    }

試試這個....我修改了你的代碼

try this....



if(rowciew==null){   
ViewHolder viewholder; 
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);

viewholder=new ViewHolder();

viewholder.textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);

viewholder.checkBoxItem = (CheckBox)rowView.findViewById(R.id.checkboxList);

rowView.setTag(viewholder);
}else{
   viewholder=(ViewHolder) rowview.getTag();
}
  textView_name.setText(item_name[position]);

// Row View got click
rowView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (viewholder.checkBoxItem.isChecked()==true){
            viewholder.checkBoxItem.setChecked(false);

        }
        else viewholder.checkBoxItem.setChecked(true);
    }
});

// Return row view
return rowView;

private class ViewHolder {
    TextView textView_name;
    CheckBox checkBoxItem;
}

}

似乎你缺少保留復選框的狀態。 每次在滾動期間看到項目時,Android都會重新呈現它。 試試吧

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  //Inflate Single View
  View v= View.inflate(context, R.layout.row_item, null);

  //Bind Components
  TextView textView_name = (TextView) v.findViewById(R.id.textViewItemName);
  CheckBox checkBoxItem = (CheckBox) v.findViewById(R.id.checkboxList);

  //Populate Componengts
  textView_name.setText(item_name[position]);

  //Identify Checkbox clicks
  checkBoxItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
  {
    @Override
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
    {
      //Save checked data somewhere after checking isChecked()
    }
  });

  //Check checkbox state here
  if(checkBoxItem.isChecked())
  {
    checkBoxItem.setChecked(true);
  }
  else
  {
    checkBoxItem.setChecked(false);
  }

  //Return View
  return v;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM