在ListView中点击按钮时增加TextView的值

3

我在listview行中有一个buttontextview。我希望在同一行中单击按钮时增加textview的值。以下是我的代码,它更新了多个行而不是我需要的单个行。

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;
}

}


大家好,问题已经解决了。感谢你们的支持。问题出在这一行代码:notifyDataSetChanged()。我将其注释掉后,现在一切都正常了。 :-) - Vipin
2个回答

2

你的错误有以下几点:

第一点

原文:

viewHolder.mSwitcher1.setTag(position);

修改为:

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

第二点

不需要两次获取视图标签,只需一次即可获得确切的选定位置,适配器代码应该像下面这样:

ListviewAdapter:

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;
    }

}

我没有收到任何错误,但是更新的textview值在多行上反映。 - Vipin
你修改了什么?我告诉你要改这行代码:viewHolder.mSwitcher1.setText(String.valueOf(counters[pos])); 但是你没有好好检查我的代码。 - RobinHood
请下载并检查此演示。http://www.nippyzip.com/uploads/130410040813-93882.zip - RobinHood
嘿,问题解决了。感谢您的支持。问题出在这一行代码:notifyDataSetChanged()。我注释掉了这行代码,现在它运行正常了。 :-) - Vipin

1

点击链接并修改了代码,但仍然没有改变。格式化后的代码已更新在我的问题中。 - Vipin
是的,这并不是解决您问题的方法。我认为您应该有一个额外的数组,其大小等于您想要增加值的文本视图数量。在此数组中,您应该保留将显示在文本视图中的值。当您想要增加其中一个文本视图中的值时,您只需增加数组的一个元素即可。 - Michał Z.
嘿,问题已经解决了。谢谢你的支持。问题出在这一行代码上:notifyDataSetChanged()。我注释掉了这一行,现在它正常工作了。 :-) - Vipin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接