1

I'm trying solver event of CheckBox. but when I click on checkbox then after that I scroll my list and I see that in the next item list have some checkbox was checked.

Here is the image

enter image description here

And Here is code:

package com.tsdv.wds.GUI.Server;

import java.io.File;
import java.util.ArrayList;

import com.tsdv.wds.R;
import com.tsdv.wds.manager.FileItems;
import com.tsdv.wds.manager.FileManager;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ItemFileAdapter2 extends BaseAdapter implements OnClickListener{

    private static final String TAG = "ItemFileAdapter";
    Context context;
    FileManager fileManager;
    ArrayList<FileItems> arrayList;
    LayoutInflater inflater;
    ViewHolder holder;
    int mPosition;

    public ItemFileAdapter2(Context context, ArrayList<FileItems> arrayList, FileManager fileManager) {
        super();
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.fileManager = fileManager;
        this.arrayList = arrayList;
        Log.d(TAG, "create " + this.arrayList.size());
        //holder = new ViewHolder();

    }

    @Override
    public int getCount() {
        return arrayList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return arrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        mPosition = position;
        holder = new ViewHolder();
        if (null == convertView){
            convertView = inflater.inflate(R.layout.item_custom_lv_serverfile, null);
            convertView.setTag(holder);
            Log.d(TAG, "Position: " + position);
        } else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.llFilenameAndInfo = (LinearLayout) convertView.findViewById(R.id.llFilenameAndInfo);
        holder.llFilenameAndInfo.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                File path = new File(arrayList.get(position).getParent()
                        .toString()
                        + File.separator
                        + arrayList.get(position).getName().toString());
                ServerMainActivity.setPath(path);
                arrayList = fileManager.displayDirectory(
                        arrayList.get(position).getParent(),
                        arrayList.get(position).getName());
                ItemFileAdapter2.this.notifyDataSetChanged();

            }
        });
        holder.imvThumbnail = (ImageView) convertView.findViewById(R.id.imvThumbnail);
        holder.imvThumbnail.setImageBitmap(arrayList.get(position).getThumnail());
        holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
        holder.tvName.setText(arrayList.get(position).getName());
        holder.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
        holder.tvInfo.setText("Info");
        holder.cbRead = (CheckBox) convertView.findViewById(R.id.cbRead);
        holder.cbRead.setVisibility(View.VISIBLE);
        holder.cbWrite = (CheckBox) convertView.findViewById(R.id.cbWrite);
        holder.cbWrite.setVisibility(View.VISIBLE);
        if (!arrayList.get(position).isDirectory()){
            Log.d(TAG, "invisible: " + position);
            holder.cbRead.setVisibility(View.INVISIBLE);
            holder.cbWrite.setVisibility(View.INVISIBLE);
        }

        return convertView;
    }
    private class ViewHolder {
        LinearLayout llFilenameAndInfo;
        TextView tvName;
        TextView tvInfo;
        ImageView imvThumbnail;
        CheckBox cbRead;
        CheckBox cbWrite;
    }
    @Override
    public void onClick(View v) {
        if (arrayList.get(mPosition).isDirectory()) {
            File path = new File(arrayList.get(mPosition).getParent().toString() + File.separator + arrayList.get(mPosition).getName().toString());
            ServerMainActivity.setPath(path);
            arrayList = fileManager.displayDirectory(arrayList.get(mPosition).getParent(), arrayList.get(mPosition).getName());
            ItemFileAdapter2.this.notifyDataSetChanged();
        }

    }
}
Sufian
  • 6,405
  • 16
  • 66
  • 120
Khiem
  • 11
  • 1
  • 1
    Any reason you are not using `ArrayAdapter` as I see your underlying data are stored in an `ArrayList`? – biegleux Aug 17 '12 at 04:17
  • I have used ArrayAdapter but have same issue. I think ArrayAdapter and BaseAdapter are not much different. – Khiem Aug 17 '12 at 04:27
  • Checkout my [blog post](http://www.lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html) – Lalit Poptani Aug 17 '12 at 04:56
  • I too had the similar problem.But i manage to solve problem with the help of this discussion.... http://stackoverflow.com/questions/7738527/getting-an-issue-while-checking-the-dynamically-generated-checkbox-through-list – himanshu Aug 17 '12 at 04:28
  • Try this Link http://windrealm.org/tutorials/android/listview-with-checkboxes-without-listactivity.php – grv_9098 Aug 17 '12 at 04:23
  • you have to maintain that which position is checked if(arrayList.get(position).isChecked){ holder.cbRead .(true) } else{ holder.cbRead .(false) } – Rahul Sep 04 '15 at 11:07

2 Answers2

0

Note that the ListAdapter concept is reusing the View hidden when you scroll up/down. This makes the other Item View to have the same state with the previously hidden Item View.

try adding boolean class variable that will hold cbRead and cbWrite values to your FileItems class and inside the getView get that FileItems object based from the "position" parameter and before returning the convertView object, set the values of cbRead and cbWrite objects.

Let me know if this solved your issue.

Macchiato
  • 825
  • 1
  • 11
  • 24
0

As you are using a convertView (Its a view which is being reused/recycled) a check is already exist in convertView because was being checked before.

Use this code it will solve your problem.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    mPosition = position;
    holder = new ViewHolder();
    if (null == convertView){
        convertView = inflater.inflate(R.layout.item_custom_lv_serverfile, null);
        convertView.setTag(holder);
        Log.d(TAG, "Position: " + position);
    } else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.llFilenameAndInfo = (LinearLayout) convertView.findViewById(R.id.llFilenameAndInfo);
    holder.llFilenameAndInfo.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            File path = new File(arrayList.get(position).getParent()
                    .toString()
                    + File.separator
                    + arrayList.get(position).getName().toString());
            ServerMainActivity.setPath(path);
            arrayList = fileManager.displayDirectory(
                    arrayList.get(position).getParent(),
                    arrayList.get(position).getName());
            ItemFileAdapter2.this.notifyDataSetChanged();

        }
    });
    holder.imvThumbnail = (ImageView) convertView.findViewById(R.id.imvThumbnail);
    holder.imvThumbnail.setImageBitmap(arrayList.get(position).getThumnail());
    holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
    holder.tvName.setText(arrayList.get(position).getName());
    holder.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
    holder.tvInfo.setText("Info");
    holder.cbRead = (CheckBox) convertView.findViewById(R.id.cbRead);
    holder.cbRead.setVisibility(View.VISIBLE);
    holder.cbRead.setChecked(false);
    holder.cbWrite = (CheckBox) convertView.findViewById(R.id.cbWrite);
    holder.cbWrite.setVisibility(View.VISIBLE);
    holder.cbWrite.setChecked(false);
    if (!arrayList.get(position).isDirectory()){
        Log.d(TAG, "invisible: " + position);
        holder.cbRead.setVisibility(View.INVISIBLE);
        holder.cbWrite.setVisibility(View.INVISIBLE);
    }


    // check it based on value in List.

    return convertView;
}

To store the value of check add a CheckChangedListener and store the check state in an list of Boolean and retrieve it on getView.

Vivek Khandelwal
  • 7,829
  • 3
  • 25
  • 40