1

我正在嘗試創建一個類似於Google Keep的UI。我知道如何使用Recycler View創建交錯的View。如果我點擊特定的卡片。然後它必須打開一個活動。Recycler查看Activity中的Onclick方法?

我能實現這個using onclick method.

這同樣的情形發生在我的應用程序ATLEAST 5個不同的活動。

我的問題是,

  1. 我可以使用所有5個地方這種單一適配器?

    1. 如果是,我應該在哪裏放置onclick操作?

    2. 如果不是,我如何創建像Keep一樣的交錯佈局?

先謝謝了!

+0

我很困惑你在哪裏卡住。你提供的鏈接顯示瞭如何做你想做的事情。所以也許這個問題不清楚。 – NoChinDeluxe

+1

如果我在我的適配器中使用Onclick方法。有用。然後對於另一個活動,我必須創建另一個適配器。所以它需要5個適配器及更多。這是一個好習慣嗎? – user3467240

+0

如果所有五項活動都是相同的數據,那麼您可以使用同一個適配器。但你爲什麼這樣做。相反,您可以使用單個活動並使用按鈕來更改視圖。 – cgr

回答

-1

(請參閱編輯應用RecyclerView下文)

就像我在我的評論中提到,它肯定是細到對所有的活動,使用不同的數據和觀點單獨的適配器。隨着您的應用數據和佈局變得越來越複雜,您的代碼也變得越來越複雜......這就是它的方式。

但是,如果您的某些活動在其ListView中使用了類似的數據(例如,可能是兩個TextView和一個ImageButton),您可以通過定義可用於多個活動的單個適配器來節省一些工作量。然後,您會爲每個Activity實例化單獨的對象,類似於創建多個ArrayAdapter<String>對象以填充多個ListViews的方式。

編寫自定義適配器時,BaseAdapter是一個很好的類。它非常靈活,並且可以完全控制ListView中顯示的數據。這裏有一個小例子:

public class CustomBaseAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<String> listData; 

    public CustomBaseAdapter(Context context, ArrayList<String> listData) { 
     this.context = context; 
     this.listData = listData; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.your_list_item_layout, parent, false); 

      //populate the view with your data -- some examples... 
      TextView textData = (TextView) convertView.findViewById(R.id.yourTextView); 
      textData.setText(listData.get(position)); 

      ImageButton button = (ImageButton) convertView.findViewById(R.id.yourImageButton); 
      button.setOnClickListener(new View.OnClickListener() { 
       //... 
       //... 
      }); 
     } 

     return convertView; 
    } 

    @Override 
    public Object getItem(int position) { 
     return 0; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 
} 

所以這段代碼的關鍵部分是明顯的getView()方法,被稱爲每次ListView控件需要一些數據來顯示時間。爲了提高效率,視圖被存儲在一個名爲convertView的東西中,以便它們可以被重複使用,並且不必在每次屏幕上出現視圖時都充氣。

因此,我們在getView()中所做的工作首先要查明convertView是否存在。如果是這樣,我們只是將它傳遞給調用的ListView,因爲所有東西都應該已經實例化並準備好了。如果convertView爲空,則意味着數據尚未實例化(或因任何原因需要重新實例化),因此我們膨脹一個全新的視圖並使用我們的數據填充它。

在上面這個例子中適配器的情況下

所以,如果您的幾個活動的所有顯示的字符串的一個列表,你可以重複使用該適配器爲每一個,您創建了一個新的每次路過不同ArrayList<String>通過構造目的。但是如果你有更多的數據可以顯示,你顯然可以傳遞更多的信息。複雜程度取決於您。如果你的活動之間的差異太大了,我會爲它們全部創建這個類的自定義版本,只是將它們實例化並填充它們,然而你願意。它將保持所有數據的組織和封裝。

希望這會有所幫助!如果您需要,可隨時提出問題以獲得更多解釋。


編輯迴應評論

由於您使用的是RecyclerView,而不是僅僅簡單的列表視圖(我,出於某種原因,完全忘了),你仍然可以做的非常相似使用RecyclerView.Adapter<YourViewHolder>東西代替。區別在於,不是在getView()方法中誇大視圖,而是在您定製的ViewHolder內膨脹,而我假設您已擁有該視圖。代碼可能看起來像這樣:

public class CustomRecyclerViewAdapter extends RecyclerView.Adapter<StringViewHolder> { 

    private final List<String> items; 

    public CustomRecyclerViewAdapter(ArrayList<String> items) { 
     this.items = items; 
    } 

    @Override 
    public StringViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     //So instead of inflating the views here or in a getView() like in 
     //in the BaseAdapter, you would instead inflate them in your custom 
     //ViewHolder. 
     return new StringViewHolder(parent); 
    } 

    @Override 
    public void onBindViewHolder(StringViewHolder holder, int position) { 
     holder.setModel(items.get(position)); 
    } 

    @Override 
    public long getItemId(int position) { 
     return items.get(position).hashCode(); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 
} 
+0

問題指定使用「Recycler View」,並且您正在回答「List View」。回答時請小心。 –

+0

@VipulAsri - 哎呀,是的,你是對的。在嘗試展示如何使用自定義適配器後,我更多地使用了自定義適配器,而BaseAdapter是其中一種更簡單的方法。但你是對的,它應該爲RecyclerView量身定做。當我有機會時,我會做一些編輯。 – NoChinDeluxe