Android ListView 多個ItemViewType 導致View型別混亂的解決辦法
關於ListView的基本使用,應該都很清楚。無非就是用一個ViewHolder快取,然後重用convertView。如下:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null); viewHolder = new ViewHolder(); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.chat_head_iv); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } return convertView; } class ViewHolder { ImageView imageView; }
但是這次在做一個即時通訊的專案是,ListView中要放的ItemViewType 有十幾個之多。然後,同樣的使用上面的快取方法,如下:
private class ChatHeadAdapter extends BaseAdapter { @Override public int getCount() { return 50; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return position % 2;// Type 兩種 0和1 } @Override public int getViewTypeCount() { return 2; } @Override public View getView(int position, View convertView, ViewGroup parent) { int viewType = getItemViewType(position); LeftViewHolder leftViewHolder = null; RightViewHolder rightViewHolder = null; if (convertView == null) { if (viewType == 0) {// left convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null); leftViewHolder = new LeftViewHolder(); leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv); convertView.setTag(leftViewHolder); } else { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null); rightViewHolder = new RightViewHolder(); rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv); convertView.setTag(rightViewHolder); } } else { if (viewType == 0) {// left leftViewHolder = (LeftViewHolder) convertView.getTag(); } else { rightViewHolder = (RightViewHolder) convertView.getTag(); } } if (viewType == 0) {// left leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left); } else { rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right); } return convertView; } class LeftViewHolder { ImageView leftImageView; } class RightViewHolder { ImageView rightImageView; } }
當然實際情況比上面的要複雜的多,上面只是一個簡單的例子。
不知道是由於什麼原因,用了類似上面的方法來處理我的十幾個ItemViewType,還是會經常出現ViewItem的型別不正確,查詢很久也沒發現原因。
然後只能通過下面的設定,解決這個問題。
@Override public View getView(int position, View convertView, ViewGroup parent) { int viewType = getItemViewType(position); LeftViewHolder leftViewHolder = null; RightViewHolder rightViewHolder = null; if (convertView == null||((Integer) convertView.getTag(R.id.tag_key_chat_item_type))!=viewType) { if (viewType == 0) {// left convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null); leftViewHolder = new LeftViewHolder(); leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv); convertView.setTag(R.id.tag_key_chat_item_view,leftViewHolder); } else { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null); rightViewHolder = new RightViewHolder(); rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv); convertView.setTag(R.id.tag_key_chat_item_view,rightViewHolder); } convertView.setTag(R.id.tag_key_chat_item_type, viewType); } else { if (viewType == 0) {// left leftViewHolder = (LeftViewHolder) convertView.getTag(R.id.tag_key_chat_item_view); } else { rightViewHolder = (RightViewHolder) convertView.getTag(R.id.tag_key_chat_item_view); } } if (viewType == 0) {// left leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left); } else { rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right); } return convertView; }
R.id.tag_key_chat_item_type和R.id.tag_key_chat_item_view是在ids.xml中定義的兩個普通的id
相關推薦
Android ListView 多個ItemViewType 導致View型別混亂的解決辦法
關於ListView的基本使用,應該都很清楚。無非就是用一個ViewHolder快取,然後重用convertView。如下: @Override public View getView(int position, View convertView, ViewGrou
Android listview載入資料後沒有立即重新整理的解決辦法
最近用到listview顯示從伺服器拉取回來的json資料,主要是圖片和文字資源。 Listview在載入完資料後,當我們需要ListView進行重新整理的時候,我們需要呼叫Adapter.
android ANR產生原因(三總常見型別)和解決辦法
轉載:http://blog.csdn.net/lonlylove/article/details/42006285 記得好久之前,面試時候,面試官問我,造成ANR的原因有哪些? 答: 自我感覺良好的我,就說了好多(包括了經典中兩個),最後面試官說了句,其實就三
Android Listview中Button按鈕點選事件衝突解決辦法
今天做專案時,ListView中含有了Button元件,心裡一早就知道肯定會有衝突,因為以前就遇到過,並解決過,可惜當時沒有記錄下來。 今天在做的時候,繼續被這個問題鬱悶了一把,後來解決後,趕緊來記錄下,以便日後參考。 首先,其實Listview中Button按
Android之多個View同時動畫
本文主要是記錄開發過程中遇到的坑 動畫是為了提高互動性而在應用裡增加的,單個動畫的實現有好幾種方式,比如 (View).animate().scaleY(0.5f).alpha(0.5f).translationX(100f).setDuration(500).start(
Android ListView多佈局 , 三個不同佈局的listView展示在一個頁面 ,非常獨特的一個列表展示
使用listview多佈局會出現一點問題:由於多個item佈局給單一的item佈局是不一樣的,使用起來,contentview的複用會出現問題。避免出現問題的有這幾個方法:1.重寫 getViewTypeCount() – 該方法返回多少個不同的佈局2.重寫 getItemV
android專案引用多個library導致引用android-support-v4.jar衝突
今天碰到的問題是當前的專案A引用了兩個Library B,Library C專案,本身該專案libs裡面就有android-support-v4.jar,然後這兩個Library又都
Android ListView多布局講解
androidListview優化是一個老生常談的事情了,其優化的方面也有很多種,例如,布局重用、在getView()中減少邏輯計算、減少在頁面滑動的時候加在圖片,而是在頁面停止滾動的時候再加在圖片。而今天要介紹的是另一種方式,那就是多布局。一般使用的場景有一下兩種情況:① 當一個item有多重布局的情況下,
Android ListView多選模式
ListViewListView使用多選模式好處 交互與數據分離,在多選狀態下不需要修改數據源,在最後確定的時候獲取選擇索引來確定選擇的數據。 ListView模式 CHOICE_MODE_NONE:普通模式; CHOICE_MODE_SINGLE:單選模式; CHOICE_MODE_MULTIPLE:多選
Android入門 多個Activity之間切換原理介紹
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Android將多個視訊檔案拼接為一個檔案
正文 利用android的2個類MediaExtractor(抽取音/視訊幀) + MediaMuxer (將音視訊重新寫入一個多媒體檔案,完成封裝)。 合成檔案為MP4。為啥是MP4? 因為android支援最好的就是這個格式。MediaMuxer的native實現者是MPE
pandas DataFrame高效程式設計方法: 根據多列的值做判斷,生成新的列值,其中多列的值是包含多個值的資料型別
一.遇到的問題描述: 我遇到問題的資料比較複雜,下面以比較簡單的資料為例說明問題,所以這些資料的含義是沒有意義的,可以忽略資料的的具體意義。資料如下所示: import numpy as np import pandas as pd data = {'city': [{'Beijing':1
Android recyclerview 多個佈局 item資料錯亂
這個問題困擾了兩三天,recyclerview在採用多種佈局的情況下,在onBindViewHolder繫結的時候會,會將不會顯示的佈局用View.GONE隱藏起來,看似沒有問題!但是上下滑動的時候會發生item顯示錯亂! 原本的item資料顯示,在滑動幾次後,顯示條數只剩下幾條 走了
Android 支援多個APK同時錄音
Android4.4 修改方法 原始碼路徑: sdk\hardware\libhardware_legacy\audio\AudioPolicyManagerBase.cpp audio_io_handle_t AudioPolicyManagerBase::
Android Studio多個module匯入AAR庫
介紹 有時候由於需要一些自定義之後的開源庫,無法使用jCenter裡面的官方庫,又懶得自己搭建Maven倉庫,所以我們想要自己在專案裡面直接匯入本地的AAR庫。 通用方法和問題 網上通用的AAR匯入Gradle的方法很簡單: repositories { fl
一個伺服器搭多個tomcat導致session丟失,或者同一個IP不同埠,多個應用的session會衝突解決方法
一個伺服器上搭建了多個tomcat或者weblogic,埠不一樣,同時啟動訪問時session丟失。如:A,B兩個服務,在瀏覽器中登入訪問A後,當前開啟的瀏覽器上在開一個選項卡訪問B服務後,回過來點選訪問A時session丟失,需要重新登入A才可以訪問。經過資料查詢,發
android listView多層巢狀listView顯示不全問題
最近在做專案,需要用到listVIew多層巢狀listVIew的需求,先發現已下兩個處理辦法比較好用 第一種:public class ListViewNesting extends ListView { public ListViewNesting(Context c
【Android】多個Activity之間利用bundle傳遞數值
安卓中的Activity相當於vb,mfc中的窗體,在多個Activity之間傳遞資料是一個相當核心的功能。下面舉個例子來說明這個問題。 一、基本目標 使用者在兩個輸入框中輸入使用者名稱、密碼之後,跳到另一個Activity當中,顯示其輸入的內容, 然後這兩個Activi
Android 支援多個VideoView聲音調節
有個場景就是一個頁面裡有多個VideoView播放視訊,然後每個視訊都有一個音量值,但是VideoView並不支援直接設定音量,而是要通過調節系統音量來實現,那麼這樣的話,就不能實現為每個視訊獨立調節音量了我們知道MediaPlayer+SurfaceView也能實現視訊的
Android webview多個頁面goback無法銷燬當前activity的處理
webview載入一個網頁,這個網頁會連結到另一個網頁,這兩個網頁頂部都有h5寫的返回圖示,點選返回之前是這樣的: @JavascriptInterface public void goBack() { finish();