我目前正在致力於一個Android項目,其中有一個Recyclerview
。 Recyclerview保存不同類型的項目。項目是不同的文件(文檔,PDF,圖像和視頻)。我正在使用Gridlayoutmanager
。我想在循環播放視圖中將兩種視圖充滿行,一種視圖是圖像和視頻,另一種視圖是其他類型的文件(doc,pdf等)。所有文件都是混合的,噸知道哪種類型的文件順序。我知道我必須使用getItemViewType
和onCreateViewHolder
膨脹行。如果我使用的是普通的方式,先膨脹行,然後根據膨脹行的類型填充行不起作用,因爲所有的文件都是隨機的。我想根據文件的類型膨脹行。可能是我需要從onBindViewHolder
觸發getItemViewType
,以擴大所需的類型。我已經閱讀過SO中的問題。沒有問題直接關係到這個問題。所有的問題都是先將行膨脹並填充行中的細節。任何想法如何膨脹取決於細節類型(我的案例中的文件)?根據RecyclerView的每一行中的數據類型膨脹視圖的行數
1
A
回答
1
創建內部您適配器類:
class ViewHolder{
public ViewHolder(View v, int type){
super(itemView);
this.type=type; //here we have type of view holder
}
}
在適配器實現方法:
final int VIEW_VIDEO=2;
final int VIEW_STANDARD=1;
public int getItemViewType(int position) {
//here return some view type
if (isVideo(position)){ //example method checking is video row
return VIEW_VIDEO;
}else{
return VIEW_STANDARD
}
}
如果使用,其根據所述類型第一膨脹所述行和填充所述行一般的方式的行充氣不起作用,因爲所有的文件都是隨機的
I n getItemViewType您有位置,所以也許這是可以檢查此行中的文件類型。如果你的適配器有數據(如果列表顯示那麼肯定有),那麼可以檢查我們需要在視圖上設置什麼類型的文件。
例isVideo方法檢查的文件擴展名:
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View v;
if (viewType==VIEW_VIDEO){
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.video_layout, parent, false);
}else{
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.standard_layout, parent, false);
}
return new ViewHolder(v,viewType); //here we have view holder with right view
}
最後一件事在適配器:
private boolean isVideo(position){
String filename=list.get(position); //list Your Strings
String filenameArray[] = filename.split("\\.");
String extension = filenameArray[filenameArray.length-1];
return extension=="mp4"; //change this to more flexible
}
適配器來實現Next方法
public void onBindViewHolder(final ViewHolder holder, int position){
if (holder.type==VIEW_VIDEO){
//staff on video
}
}
0
實際上有許多解決方案,但這是我的最愛:
public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.FeedItemHolder> {
static final int VIEW_TYPE_HEADER = 0;
static final int VIEW_TYPE_NORMAL = 1;
static final int VIEW_TYPE_FOOTER = 2;
@Override
public FeedItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
logd("create view holder called");
int resid = 0;
if (viewType == VIEW_TYPE_HEADER) {
resid = R.layout.item_header;
} else if (viewType == VIEW_TYPE_NORMAL) {
resid = R.layout.item_normal;
} else if (viewType == VIEW_TYPE_FOOTER) {
resid = R.layout.item_footer;
}
View v = LayoutInflater.from(context).inflate(resid, parent, false);
return new FeedItemHolder(context, viewType);
}
private void bindNormal(FeedItemHolder holder, int position) {
// specialized bind method for normal items
...
}
private void bindHeader(FeedItemHolder holder, int position) {
// specialized bind method for header items
...
}
private void bindFooter(FeedItemHolder holder, int position) {
// specialized bind method for footer items
...
}
@Override
public void onBindViewHolder(FeedItemHolder holder, int position) {
int viewType = getItemViewType(position);
if (viewType == VIEW_TYPE_HEADER) {
bindHeader(holder, position);
} else if (viewType == VIEW_TYPE_NORMAL) {
bindNormal(holder, position);
} else if (viewType == VIEW_TYPE_FOOTER) {
bindFooter(holder, position);
}
}
@Override
public int getItemViewType(int position) {
// determine view type, e.g:
//
// if (position == 0)
// return VIEW_TYPE_HEADER;
// else if (postion > itemCount)
// return VIEW_TYPE_FOOTER;
// else
// return VIEW_TYPE_NORMAL;
...
}
private View.OnClickListener showCommentsListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder != null) {
TimelineEntryRaw entry = (TimelineEntryRaw) v.getTag();
holder.onCommentsRequest(entry, false);
}
}
};
public class FeedItemHolder extends RecyclerView.ViewHolder {
private View root;
// header items' views
private TextView title;
...
// normal items' views
private TextView contentText;
...
// footer items' views
private View loadMoreBtn;
...
public FeedItemHolder(View itemView, int itemType) {
// the call to parent constructor is the only
// reason android knows which view to show
super(itemView);
root = itemView;
if (itemType == VIEW_TYPE_HEADER) {
// fetch header item views
loadMoreBtn = findView(itemView, R.id.item_header__title);
...
}
if (itemType == VIEW_TYPE_NORMAL) {
// fetch views for normal item
contentText = findView(itemView, R.id.item_normal__content);
...
}
if (itemType != VIEW_TYPE_FOOTER) {
// fetch views for footer item
loadMoreBtn = findView(itemView, R.id.item_footer__btn);
...
}
} // end Holder constructor
} // end class Holder
}
長話短說,在創建視圖持有者和綁定視圖持有者你有基於其視圖類型來創建和綁定視圖
相關問題
- 1. 從recyclerview的每一行獲取數據
- 2. 膨脹視圖
- 3. 膨脹視圖
- 4. RecyclerView奇怪行爲膨脹細胞
- 5. 循環視圖膨脹不同的行: - 綁定數據時發生異常
- 6. zlib膨脹數據錯誤
- 7. GAE數據存儲奇怪的膨脹
- 8. Android使用數據庫中的數據膨脹線性佈局
- 9. Android膨脹視圖
- 10. 恢復過程中memsql數據膨脹
- 11. 計數一行數據的類型
- 12. 根據數據類型在單行中輸出mysql表數據
- 13. 從佈局文件膨脹我自己的視圖類型?
- 14. 如何在Python中膨脹一些Peoplesoft(Java)壓縮的數據?
- 15. 以編程方式在RecyclerView中創建或膨脹視圖OnCreateViewHolder
- 16. 如何根據SQL中的另一個列類型對行數進行計數
- 17. 檢查中每一行的數據類型在vb.net
- 18. 如何膨脹自定義視圖類?
- 19. 錯誤膨脹類,自定義視圖
- 20. 錯誤膨脹內部類視圖
- 21. 如何避免Access數據庫膨脹?
- 22. 錯誤:膨脹錯誤數據錯誤
- 23. 膨脹視圖爲空
- 24. Android視圖膨脹異常?
- 25. 將視圖膨脹到LinearLayout
- 26. 視圖中列的數據類型
- 27. 如何根據行中的數據改變列表視圖的行顏色
- 28. ListView中的行正在彼此膨脹
- 29. 在Listview上調用invalidateViews()是否重新膨脹視圖的行?
- 30. 膨脹的視圖不更新
感謝您的答覆。在'getItemViewtype'中,我無法檢查該行是否只是使用「position」參數的Video文件或Normal文件。文件是混合的。我不能通過使用它的位置來說出文件的類型。這是我的問題。 – Naroju
所以當你知道它是什麼?你有什麼數據適配器? –
我將一個ArrayList的文件名(字符串)輸入到Adapter類的構造函數中。所以ArrayList包含文件名隨機,我不知道哪種文件類型的particuler位置。有沒有一種方法可以根據文件擴展名進行膨脹? – Naroju