2016-04-29 422 views
0

我正在嘗試(約4天)來更改特定列表視圖項目的視圖。我嘗試了很多可用的解決方案,雖然這個問題看起來可能是「重複的」,但我已盡最大努力實施所有解決方案,但仍然沒有運氣。如何更改/更新列表視圖的單個列表項?

所以這裏是我的問題,我有一個列表視圖,它是通過使用延伸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

我已經閱讀過它,但它包含很多信息,你能在那裏解釋「我的部分」嗎? –