Увеличьте значение textview при нажатии кнопки в списке

У меня есть button и textview вместе в listview строке. Я хочу увеличить значение 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;
}

}


person Vipin    schedule 10.04.2013    source источник
comment
Эй, парень. . проблема решилась. .Спасибо за поддержку. Проблема была с этой строкой: notifyDataSetChanged(). Я прокомментировал эту строку, и теперь она работает нормально. :-)   -  person Vipin    schedule 10.04.2013


Ответы (2)


Вы совершаете ошибки: перечисленные ниже:

Первый

Использовал:

viewHolder.mSwitcher1.setTag (позиция);

Вместо:

viewHolder.mSwitcher1.setTag (Integer.valueOf (позиция));

Второй

Нет необходимости получать представление tag дважды, достаточно одного раза, чтобы получить точную выбранную позицию, код адаптера будет выглядеть следующим образом:

Адаптер списка:

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

}
person RobinHood    schedule 10.04.2013
comment
я не получаю никаких ошибок, но обновляю значения textview, отражающие несколько строк - person Vipin; 10.04.2013
comment
что ты модифицировал? Я сказал вам изменить эту строку viewHolder.mSwitcher1.setText(String.valueOf(counters[pos])); кода, но вы не проверили мой код должным образом. - person RobinHood; 10.04.2013
comment
загрузите и проверьте эту демонстрацию. > - person RobinHood; 10.04.2013
comment
Эй, проблема решена. .Спасибо за поддержку. Проблема была с этой строкой: notifyDataSetChanged(). Я прокомментировал эту строку, и теперь она работает нормально. :-) - person Vipin; 10.04.2013

И вы неправильно используете шаблон ViewHolder. Прочитайте это:

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

person Michał Z.    schedule 10.04.2013
comment
перешел по ссылке и изменил код, все тот же. .formated код обновлен по моему вопросу - person Vipin; 10.04.2013
comment
Да, это не было решением вашей проблемы. Я думаю, что у вас должен быть дополнительный массив с размером, равным количеству ваших текстовых просмотров, где вы хотите увеличивать значения. В этом массиве вы должны хранить значения, которые будут отображаться в текстовых представлениях. И когда вы хотите увеличить значение в одном из текстовых представлений, вы увеличиваете элемент массива. - person Michał Z.; 10.04.2013
comment
Эй, проблема решена. .Спасибо за поддержку. Проблема была с этой строкой: notifyDataSetChanged(). Я прокомментировал эту строку, и теперь она работает нормально. :-) - person Vipin; 10.04.2013