2015-07-08 6 views
1

Я создал представление списка, как показано в этом image.Link:набор текста в TextView элемента списка по нажатию кнопки

Image

Проблема: Я хочу, что если пользователь нажимает на кнопка + или - текстовое изображение, которое в настоящее время отображается 0, соответственно увеличивается или уменьшается. Но если я нажму кнопку первого элемента, текст будет обновлен в другой строке. Я не знаю, как это реализовать.

Вот код:

public class HomePage extends Fragment { 

    String[] listitems; 
    int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk, 
      R.drawable.perk, R.drawable.kitkat, 
      R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar, 
      R.drawable.snickers }; 
    ListView list; 
    DBAdapter dbadapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View rootview = inflater.inflate(R.layout.activity_home_page, 
       container, false); 
     View view = View.inflate(getActivity(), R.layout.headerview, null); 

     Resources res = getResources(); 
     listitems = res.getStringArray(R.array.items); 
     list = (ListView) rootview.findViewById(R.id.itemslist); 
     list.addHeaderView(view); 
     AdapterClass adapterClass = new AdapterClass(this.getActivity(), 
       listitems, images); 
     list.setAdapter(adapterClass); 
     return rootview; 
    } 

} 

class AdapterClass extends ArrayAdapter<String> { 
    Context context; 
    int[] images; 
    String[] names; 
    Button add, sub; 
    TextView number; 
    Integer count=0; 

    static class ViewHolder { 
     public TextView textView; 
     public ImageView imageView; 

    } 

    public AdapterClass(Context c, String[] items, int imgs[]) { 
     // TODO Auto-generated constructor stub 
     super(c, R.layout.rowlayout, R.id.quantity, items); 
     this.context = c; 
     this.images = imgs; 
     this.names = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View row = convertView; 
     // reuse views 

     if (row == null) { 

      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.rowlayout, parent, false); 
      ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView) row.findViewById(R.id.img); 
      viewHolder.textView = (TextView) row.findViewById(R.id.textView1); 
      add = (Button) row.findViewById(R.id.button1); 
      add.setTag(position); 
      sub = (Button) row.findViewById(R.id.button2); 
      sub.setTag(position); 
      number = (TextView)row.findViewById(R.id.quantity); 

      row.setTag(viewHolder); 
     } 
     ViewHolder holder = (ViewHolder) row.getTag(); 
     holder.imageView.setImageResource(images[position]); 
     holder.textView.setText(names[position]); 
     add.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       count=count+1; 
       number.setText(count.toString()); 
      } 
     }); 

     sub.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       count=count-1; 
       number.setText(count.toString()); 
      } 
     }); 
     return row; 
    } 



} 

Пожалуйста, помогите. Также мне нужна помощь в том, как показать элементы, текст которых содержит положительное число в следующем действии или фрагменте.

+0

Вот ответ на аналогичный вопрос (изменение данных, отображаемых в ListView/RecyclerView) - http://stackoverflow.com/questions/25653905/adapter-update-not-visible-rows/25654089 # 25654089 – ataulm

+0

Как обновить, как подсчет по кликному элементу списка, только андроид. Когда я щелкнул, как в элементе первого списка, который обновляется, как count on lastitem. – Harsha

+0

recycelrview с 10 элементами. 5-й элемент уже имеет счетчик 2, если пользователь нажимает на этот инкремент счетчика и обновляет его в этом представлении только после установки ответа. Без ограничений для lik.please help me – Harsha

ответ

2

Следуйте за первоначальным запросом с ответом user370305.

Просьба помочь.Также мне нужна помощь в том, как показать элементы, текст которых содержит положительное число в следующем действии или фрагменте.

Создайте структуру данных, я беру HashMap, где ключ String.valueOf (position), а значение - int.

Знаете ключи, так как они будут от позиции «0» до listitem.length. Используя ключ, вы можете получить значения счета и проверить положительные.

Почему Hashmap: потому что каждый раз, когда вы меняете счет, новое значение будет завышено. (В hashmap поддерживается только один уникальный ключ).

(позиция = 0, count = 0) -> - нажата на 0-я строка -> (позиция 0, счет = -1) будет переопределена на ячейке с ключом = 0.

Полный код (с приращением номер исправления и установив положительное значение в): структура данных

public class HomePage extends Fragment { 

    String[] listitems; 
    int[] images = { R.drawable.cadburysilk, R.drawable.cadburys_dairymilk, 
      R.drawable.perk, R.drawable.kitkat, 
      R.drawable.nestlemunchchocolate, R.drawable.cadbury_bournville_bar, 
      R.drawable.snickers }; 
    ListView list; 
    DBAdapter dbadapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     View rootview = inflater.inflate(R.layout.activity_home_page, 
       container, false); 
     View view = View.inflate(getActivity(), R.layout.headerview, null); 

     Resources res = getResources(); 
     listitems = res.getStringArray(R.array.items); 
     list = (ListView) rootview.findViewById(R.id.itemslist); 
     list.addHeaderView(view); 
     AdapterClass adapterClass = new AdapterClass(this.getActivity(), 
       listitems, images); 
     list.setAdapter(adapterClass); 
     return rootview; 

     //You can use adapterClass.getPositiveNumber(); to retrieve all positive rows and the values! 
     //Unique key will be String : 1,2,3....listitems.length. 

    } 

} 

class AdapterClass extends ArrayAdapter<String> { 
    Context context; 
    int[] images; 
    String[] names; 
    Button add, sub; 
    ViewHolder holder; // Since will be accessed inside onclick 

    HashMap<String,Integers> positiveNumbers = new HashMap<String,Integers>; 
    Integer count=0; 

    static class ViewHolder { 
     public TextView textView; 
     public ImageView imageView; 
     public TextView number; 
     public String uniqueKey; 

    } 

    public AdapterClass(Context c, String[] items, int imgs[]) { 
     // TODO Auto-generated constructor stub 
     super(c, R.layout.rowlayout, R.id.quantity, items); 
     this.context = c; 
     this.images = imgs; 
     this.names = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View row = convertView; 
     // reuse views 

     if (row == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.rowlayout, parent, false); 
      ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView) row.findViewById(R.id.img); 
      viewHolder.textView = (TextView) row.findViewById(R.id.textView1); 
      viewHolder.number = (TextView)row.findViewById(R.id.quantity); 
      viewHolder.uniqueKey = String.valueOf(position); 
      add = (Button) row.findViewById(R.id.button1); 
      add.setTag(position); 
      sub = (Button) row.findViewById(R.id.button2); 
      sub.setTag(position); 
      row.setTag(viewHolder); 

     } 
     holder = (ViewHolder) row.getTag(); //keeping one global memory 
     holder.imageView.setImageResource(images[position]); 
     holder.textView.setText(names[position]); 
     add.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       count=count+1; 
       holder.number.setText(count.toString()); 
       positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count 
      } 
     }); 

     sub.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       count=count-1; 
       holder.number.setText(count.toString()); 
       positiveNumbers.put(holder.uniqueKey,count); //Key -> String.valueOf(position) and Value -> int count 
      } 
     }); 

     return row; 
    } 


    public Map<String,Integer> getPositiveNumbers() 
    { 
     return positiveNumbers; 
    } 


} 

P.S. Я набрал в редакторе, может быть некоторая ошибка времени компиляции. Также вы можете хранить объекты каждой строки против ключа, так что, когда вы получаете положительный счет, вы можете получить любую другую ссылку, такую ​​как изображение, которое, как я полагаю, вам нужно будет показать позже!

+0

Поскольку я новичок, я понял это скорее чем другие ответы. Возможно, они более предпочтительны. Но это определенно правильно. Thanks –

+0

Рад помочь! :) – Kay

+0

увеличьте количество просмотров на существующее значение на 1 и обновите на этом представлении android recycelrview.any numberof раз пользователь может обновить и увеличить счет – Harsha

5

Я написал короткий demo for my answer which you can see here.

Пример:

Когда вы будете готовы, вы можете использовать источник данных (не ваш адаптер, а не ваш ListView), чтобы найти продукты, которые имеют величину> 0.

public List<Product> getBasket() { 
     List<Product> basket = new ArrayList<>(); 
     for (Product product : productList) { 
      if (product.quantity > 0) { 
       basket.add(product); 
      } 
     } 
     return basket; 
    } 

У вашего адаптера есть одно задание: создавать/привязывать к данным, ему больше не нужно делать.


первоначальный ответ без демо:

Если вы обновляете представлений элементов непосредственно, вы не сможете извлечь все элементы с положительным числом позже, потому что эти обновленные значения сохраняются только в а не в некоторой структуре данных, вы можете перебирать более.

Вот почему вы должны не просмотров пункт обновление непосредственно, но вместо того, чтобы использовать функцию обратного вызова, когда минус кнопка плюс/щелчке, изменить базовый набор данных, и вызвать adapter.notifyDatasetChanged() обновить ListView/RecyclerView снова.

Pass обратного вызова адаптер:

public interface ItemInteraction { 
    void onPlusButtonClick(long id); 
    void onMinusButtonClick(long id); 
} 

, которые вы можете использовать, установив его в качестве обратного вызова для щелчка слушателей по соответствующему виду. Идентификатор может быть любым, если он может однозначно идентифицировать элемент данных, представленный строкой списка.

final long id = item.getId(); 
plusButtonView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick() { 
     callback.onPlusButtonClick(id); 
    } 
}); 

Пример приведен в этом подобный вопрос, где OP хотел показать или скрыть звезду (с указанием любимой) для списка песен here.

Another explanation как адаптируемые виды предназначены для использования.

0

Я знаю его очень поздно, но я думал, что это может помочь другим, которые имеют аналогичные проблемы

Проблема: Я хочу, что если пользователь нажимает на кнопку + или - в TextView, которая отображается в настоящий момент 0 увеличивается или соответственно уменьшались. Но если я нажму кнопку первого элемента, текст будет обновлен в другой строке. Я не знаю, как это реализовать.

взгляд на ваш код

ViewHolder holder = (ViewHolder) row.getTag(); 
    holder.imageView.setImageResource(images[position]); 
    holder.textView.setText(names[position]); 
    add.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      count=count+1; 
      number.setText(count.toString()); 
     } 
    }); 

    sub.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      count=count-1; 
      number.setText(count.toString()); 
     } 
    }); 
    return row; 

в вашем ViewHolder вы установили значения для holder.imageview и holder.textview, которая для имени я думаю, но вы забыли установить значение для holder.number и вы меняете его значение только в методе onClick. поэтому, когда адаптер создает свое представление, он не находит никакого определенного значения, поэтому он использует ранее использованное представление для раздувания данных.

Решение: - просто используйте отдельный список для хранения номера с помощью уникальной клавиши (используйте положение адаптера в качестве ключа) и проверьте, имеет ли этот список этот ключ, что означает, что вы ранее изменили значение, чтобы получить значение из списка и установить его на textview, если ключ отсутствует, значит, вы никогда не меняли значение, поэтому установите textview с 0

 Смежные вопросы

  • Нет связанных вопросов^_^