3

I have a button and textview together in listview row. I want to increment the textview value while click the button in the same row. Below is my code, here its updating multiple rows instead of single row,where I need to.

package com.example.digitalmenuactivity;

public class ListAdapter extends BaseAdapter   {

private Activity activity;
private Activity activity1;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;

private int mCounter1=1;
private int counter=1;
private int[] counters;
int pos;





public ListAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());
    counters = new int[5];
}


static class ViewHolder {

   protected TextView mSwitcher1=null;
    protected Button btnDelete=null;
    protected TextView title=null;
    protected TextView artist=null;
    protected TextView duration=null;
    protected ImageView thumb_image=null;

}



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

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}
@Override
public int getItemViewType(int position) {
    // TODO Auto-generated method stub
    return position;
} 



public View getView(final int position,final View convertView, ViewGroup parent) {
    View vi=convertView;
    final ViewHolder viewHolder;
    pos = getItemViewType(position);
    if(convertView==null)
    {
      vi = inflater.inflate(R.layout.list_row, null);


      viewHolder = new ViewHolder();
      viewHolder.title = (TextView)vi.findViewById(R.id.title);
      viewHolder.artist = (TextView)vi.findViewById(R.id.description); 
      viewHolder.duration = (TextView)vi.findViewById(R.id.price);
      viewHolder.thumb_image =(ImageView)vi.findViewById(R.id.list_image); 

    viewHolder.btnDelete = (Button)vi.findViewById(R.id.plus);
    viewHolder.mSwitcher1 = (TextView) vi.findViewById(R.id.switcher1);




    vi.setTag(viewHolder);

    }
    else {
        viewHolder = (ViewHolder) vi.getTag();
    }
    viewHolder.btnDelete.setTag(pos);
    viewHolder.mSwitcher1.setTag(pos);



    viewHolder.btnDelete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {


             pos = (Integer) view.getTag();


            int temp=counters[pos];
            temp++;
            counters[pos]= temp;

            viewHolder.mSwitcher1.setText(String.valueOf(counters[pos]));
            notifyDataSetChanged();

            Log.d("^^^^^^", "button clicked" + counters.length);
            Log.d("^^^^^^", "temp" + temp);

        }

        });
    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);

    viewHolder.title.setText(song.get(FoodActivity.KEY_TITLE));
    viewHolder.artist.setText(song.get(FoodActivity.KEY_ARTIST));
    viewHolder.duration.setText(song.get(FoodActivity.KEY_DURATION));
    imageLoader.DisplayImage(song.get(FoodActivity.KEY_THUMB_URL),viewHolder.thumb_image);
    return vi;
}

}

4

2 回答 2

2

你没有犯错:下面列出:

第一的

用过的:

viewHolder.mSwitcher1.setTag(位置);

反而:

viewHolder.mSwitcher1.setTag(Integer.valueOf(position));

第二

无需两次获取视图标签,一次即可获得准确的选定位置,适配器代码如下所示:

列表视图适配器:

import java.util.ArrayList;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

public class ListviewAdapter extends BaseAdapter {
    ArrayList<String> getData = new ArrayList<String>();
    Context c;
    private LayoutInflater mInflater;
    int pos;
    int boxState[];
    SharedPreferences prefs;

    private int mCounter1 = 1;
    private int counter = 1;
    private int[] counters;

    public ListviewAdapter(Context cont, ArrayList<String> data) {
        // TODO Auto-generated constructor stub
        c = cont;
        getData = data;
        mInflater = LayoutInflater.from(cont);

        counters = new int[5];

    }

    public int getCount() {
        // TODO Auto-generated method stub
        return getData.size();
    }

    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class ViewHolder {
        private TextView name = null;
        private Button button = null;

    }

    @Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return getData.size();
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;
        View vi = convertView;
        pos = getItemViewType(position);

        if (convertView == null) {

            vi = mInflater.inflate(R.layout.row, null);

            holder = new ViewHolder();

            holder.name = (TextView) vi.findViewById(R.id.textView);
            holder.button = (Button) vi.findViewById(R.id.checkBox);

            vi.setTag(holder);
        }

        else {
            holder = (ViewHolder) vi.getTag();
        }

        holder.button.setTag(pos);
        holder.name.setTag(pos);

        holder.button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                pos = (Integer) v.getTag();

                int temp = counters[pos];
                temp++;
                counters[pos] = temp;

                notifyDataSetChanged();
                holder.name.setText(String.valueOf(counters[pos]));

                Log.d("^^^^^^", "button clicked" + counters.length);
                Log.d("^^^^^^", "temp" + temp);

            }
        });

        return vi;
    }

}
于 2013-04-10T07:03:51.403 回答
1

而且您错误地使用了 ViewHolder 模式。读这个:

http://www.jmanzano.es/blog/?p=166

于 2013-04-10T07:06:27.587 回答