2017-09-14 59 views
0

下面是我想要實現的示例代碼。Android:如何從外部bindView()方法訪問viewHolder?

public class ToDoCursorAdapter extends CursorAdapter { 
    ...... 

    public ToDoCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 

     ViewHolderItem viewHolder = new ViewHolderItem(); 
     View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false); 

     viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText); 
     viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text 
     ..... 

     rowView.setTag(viewHolder); 
     return rowView; 
    } 

    @Override 
    public void bindView(final View view, final Context context, final Cursor cursor) { 
     final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag(); 

     ...... 

     viewHolder.refTextV.setText(ref); 

     ...... 
    } 

    public void hideShowAll(Button but) { 

     //I want to be able to acess BUTTONS/TEXTVIWEs from this function. 
     // Like viewHolder.refTextV.setText(ref) in binView 

     Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show(); 
    } 
} 

我試圖在適配器內從另一個函數訪問的視圖元素,如ButtonTextViewbindView

另外,如果可以的話,請添加一點解釋,以便我能夠理解它的工作原理,並可能爲未來學習某些內容。

謝謝

更新

我終於在我的hideShowAll()使用notifyDataSetChanged();而不是在那裏訪問ViewHolder。我將更改存儲在數組中,然後調用notifyDataSetChanged()。它刷新了我的觀點,並根據陣列反映了我想要做出的更改。

此外,我有問題得到它爲我工作,因爲這裏提到的一些意見宣稱ViewHoldernewView之後Constructor。這不是一個好主意。你會得到錯誤的ViewHolder,而不是屬於某一行的。

+1

幾乎在所有的情況下,你並不需要外部訪問它。 什麼是用例?您想在某些操作中更新某些/所有recyclerView行嗎?如果是,則更改相應元素的數據模型並調用adapter.notifyItemChanged(position)。 –

+1

事情是**你不應該訪問ViewHolder外部bindView **。 –

+0

@PraveenSingh Thi函數'showHideAll()'正在通過'MainActivity'在一個Button上調用我有一個數組來保存元素的狀態(可見性)。我可以用它來顯示/隱藏元素,但問題是我不知道如何刷新(如果這是適當的術語)屏幕上的視圖。其餘視圖將在滾動上生效,因爲它們將引用數組的狀態。 這是我的第一個應用程序。 'adapter.notifyItemChanged(position)'刷新當前(屏幕上)視圖的狀態嗎? 感謝您的回覆。 –

回答

0

試圖聲明「ViewHolderItem viewHolder」下面的構造函數和所有覆蓋方法之外,並初始化成bindView方法

+0

謝謝你,做到了。 現在我正面臨另一個問題。 'viewHolder.arTextV.setVisibility(v.GONE);'在這個函數中應該設置什麼'v'?這應該是一個'視圖'我不知道哪一個。我在它的位置嘗試了「視圖」,但它沒有按預期工作。我期望'textView'消失,現在是一個屏幕。它沒有。 有什麼想法? –

+0

使用這個:viewHolder.arTextV.setVisibility(View.GONE); –

0

首先,初始化ViewHolderItem全球範圍內,那麼你可以訪問諸如ButtonTextView等你的看法在另一個method這樣。

public class ToDoCursorAdapter extends CursorAdapter { 
    ...... 
// initialize ViewHolderItem here 
ViewHolderItem viewHolder = new ViewHolderItem(); 
@Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     //remove this line here 
     // ViewHolderItem viewHolder = new ViewHolderItem(); 
     View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false); 

     viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText); 
     viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text 
     ..... 

     rowView.setTag(viewHolder); 
     return rowView; 
    } 

public void hideShowAll(Button but) { 

     //call it like this and do what you want 
     viewHolder.buttonIRV.setEnabled(false); 
     Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show(); 
    } 

希望它能幫助你。

+0

謝謝你的迴應。 是否做到了。 我現在的問題: 現在我正面臨另一個問題。 'viewHolder.arTextV.setVisibility(v.GONE);'在這個函數中應該設置什麼'v'?這應該是一個'視圖'我不知道哪一個。我在它的位置嘗試了「視圖」,但它沒有按預期工作。我期望'textView'消失,現在是一個屏幕。它沒有。 有什麼想法? –

+0

'viewHolder.buttonIRV.setEnabled(View.GONE);'嘗試像這樣 – HassanUsman

+0

試過了,akhi。沒有工作。 我認爲這是行不通的。我將更新一個數組以跟蹤元素的狀態,然後調用'notifyDataSetChanged()'。試圖讓這種方法奏效。 –

0

試試這個:

public class ToDoCursorAdapter extends CursorAdapter { 
...... 

public ToDoCursorAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    ViewHolderItem viewHolder = new ViewHolderItem(); 
    View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false); 

    viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText); 
    viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text 
    ..... 

    rowView.setTag(viewHolder); 
    return rowView; 
} 

@Override 
public void bindView(final View view, final Context context, final Cursor cursor) { 
    final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag(); 

    ...... 

    viewHolder.refTextV.setText(ref); 

    ...... 
} 

public void hideShowAll(Button but, ViewHolderItem viewHolder) { 

    //I want to be able to acess BUTTONS/TEXTVIWEs from this function. 
    viewHolder.refTextV.setText("hello"); 

    Toast.makeText(mContext, "Hello" , Toast.LENGTH_SHORT).show(); 
} 
} 
+0

無法將'ViewHolderItem'傳遞給'hideShowAll()'。該功能正在被其他活動調用。 謝謝你的迴應 –