2016-04-29 3 views
0

Я пытаюсь (около 4 дней) изменить вид конкретного элемента списка. Я попробовал множество решений, которые были доступны, и хотя этот вопрос может выглядеть «DUPLICATE», но я постарался на моем уровне лучше всего реализовать все решения, но все равно не повезло.Как изменить/обновить элемент списка списка?

Итак, вот мой вопрос, у меня есть вид списка, который создается с помощью адаптированного адаптера, который расширяет BaseAdapter.

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

Вот код:

Просмотр списка инициализация:

nowPlayingListView = (ListView) findViewById(R.id.nowPlayingListView); 
    nowPlayingListViewAdapter = new NowPlayingListViewAdapter(this, songsList); 
    nowPlayingListView.setAdapter(nowPlayingListViewAdapter); 

Здесь манипуляции в соответствии с состоянием:

public void handleSelectedState(Drawable dr) { 
    int currentPosition=getPosition(); 
    View singLeListItem = getViewByPosition(currentPosition, nowPlayingListView); 

    ImageButton imgButton = (ImageButton) findViewById(R.id.npListViewSingleImageButton); 

    int count = ((ViewGroup) singLeListItem).getChildCount(); 

    for (int i = 0; i < count; i++) { 
     View nextChild = ((ViewGroup) singLeListItem).getChildAt(i); 
     try { 
      //Log.d("Loop", count + "" + nextChild.getTag() + nextChild.getTag().equals("linearLayoutImageButton")); 
      if (nextChild.getTag().equals(getResources().getString(R.string.NPSingleItemLinearLayoutImgButton))) { 
       imgButton = (ImageButton) ((ViewGroup) nextChild).getChildAt(0); 
       imgButton.setImageDrawable(null); 
       imgButton.setImageDrawable(dr); 

       break; 
      } 
     } catch (Exception e) { 

     } 
    } 
} 

public View getViewByPosition(int pos, ListView listView) { 
    final int firstListItemPosition = listView.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 

    if (pos < firstListItemPosition || pos > lastListItemPosition) { 

     return listView.getAdapter().getView(pos, null, listView); 
    } else { 
     final int childIndex = pos - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 

Я пытался делать adpater.notifydatasetchanged метод после вытяжки изображений установлена но ничего не происходит.

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

Спасибо.

+0

Это лучшее, что можно изменить адаптером для управления этими состояниями. – Pooya

+0

Что именно вы подразумеваете под этим? –

ответ

0

Реализация вашего пользовательского адаптера должна быть чем-то подобным, в котором вы делаете связанные с представлением изменения в методе getView(). Ваша реализация - не правильный подход к этому.

private class RestaurantArrayAdapter extends ArrayAdapter<Restaurant> { 

    private Context context; 
    private List<Restaurant> restaurantList; 

    public RestaurantArrayAdapter(Context context, int textViewResourceId, 
            List<Restaurant> restaurantList) { 
     super(context, textViewResourceId, restaurantList); 
     this.context = context; 
     this.restaurantList = restaurantList; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.row_layout, parent, false); 
     TextView restaurantNameTextView = (TextView) rowView.findViewById(R.id.restaurantNameTextView); 
     TextView addressTextView = (TextView) rowView.findViewById(R.id.addressTextView); 
     TextView typeTextView = (TextView) rowView.findViewById(R.id.typeTextView); 
     RatingBar ratingBar = (RatingBar) rowView.findViewById(R.id.ratingBar); 
     restaurantNameTextView.setText(restaurantList.get(position).getName()); 
     addressTextView.setText(restaurantList.get(position).getAddress()); 
     typeTextView.setText(restaurantList.get(position).getType()); 
     float rating = (float) restaurantList.get(position).getRating(); 
     ratingBar.setRating(rating); 

     return rowView; 
    } 

} 
+0

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

+0

Я не думаю, что вы должны явно вызвать метод getView(). Вы можете проверить эту реализацию http://www.piwai.info/android-adapter-good-practices/ – Anurag

+0

Я прочитал ее, но в ней содержится много информации, вы можете объяснить «мою часть» там. –