1

我有一個recyclerview顯示Facebook像新聞源與評論按鈕。我無法弄清楚當用戶點擊評論按鈕時如何顯示對話框。我在這裏找到的所有解決方案都是處理整個項目的點擊,而不是其內部視圖。我也嘗試過這種精神。 How to handle multiple layout clicks in recyclerView in Android處理點擊回收視圖的內部項目

這是我的適配器類。

public class NewsfeedAdapter extends RecyclerView.Adapter<NewsfeedAdapter.NewsfeedViewHolder> { 

private final LayoutInflater inflater; 
private Context context; 

ArrayList<NewsfeedItem> data= new ArrayList<NewsfeedItem>(); 

public NewsfeedAdapter(Context context,ArrayList<NewsfeedItem> data){ 
    inflater= LayoutInflater.from(context); 
    this.data=data; 
    this.context = context; 
} 
@Override 
public NewsfeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.custom_newsfeed_row, parent, false); 
    NewsfeedViewHolder holder = new NewsfeedViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(NewsfeedViewHolder newsfeedViewHolder, int i) { 
    NewsfeedItem current = data.get(i); 
    newsfeedViewHolder.username.setText(current.username); 
    newsfeedViewHolder.icon.setImageResource(current.iconid); 
    newsfeedViewHolder.timestamp.setText((CharSequence) current.timestamp); 
    newsfeedViewHolder.news.setText(current.news); 
} 


@Override 
public int getItemCount() 
{ 
    return data.size(); 
} 


class NewsfeedViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView news, username, timestamp, comment_btn, like_btn; 
    ImageView icon; 
    private NewsfeedClickInterface clickListener; 

    public NewsfeedViewHolder(View itemView) { 
     super(itemView); 
     news = (TextView) itemView.findViewById(R.id.news); 
     timestamp = (TextView) itemView.findViewById(R.id.timestamp); 
     username = (TextView) itemView.findViewById(R.id.username); 
     icon = (ImageView) itemView.findViewById(R.id.profile_img); 
     comment_btn = (TextView) itemView.findViewById(R.id.comment_btn); 
     comment_btn.setTag("comment"); 
     comment_btn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (clickListener != null) { 
      clickListener.onItemClicked(getPosition(), v.getTag().toString()); 
     } 
    } 
} 
public interface NewsfeedClickInterface { 
    public void onItemClicked(int position, String tag); 
} 

}

回答

1

首先定義你的viewholder的接口。當按鈕被點擊時,調用這個界面。

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    public interface ViewHolderClickListener { 
     public void onItemClick(View caller, int position); 
    } 

    public ViewHolderClickListener mListener; 

    public ViewHolder(View itemView, ViewHolderClickListener listener) { 
     super(itemView); 
     mListener = listener; 
     //other initializations... 
    } 

    @Override 
    public void onClick(View v) { 
     mListener.onItemClick(v, getPosition()); 
    } 
} 

然後,在一個單獨的文件創建另一個界面,讓我們說你在一個名爲共享類來創建這個接口:

public class Commons { 

    public interface OnRecyclerItemClickedListener{ 
     public void onRecyclerItemClicked(String parameter); 
    } 

} 

然後讓你的片段/活動實現該接口。並將此接口作爲參數傳遞給適配器的構造函數。

public class MyFragment extends Fragment implements Commons.OnRecyclerItemClickedListener{ 

    @Override 
    public void onRecyclerItemClicked(String productId) { 
     //do whatever you want on click 
    } 
} 

通過這個接口適配器的構造:

//here "this" parameter is your listener since your fragment implements 
//the interface you defined 
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(items, R.layout.yourlayout, getContext(), this); 

,並在適配器中,創建在共享類中定義的接口的實例並設置它在你的構造。然後在onCreateViewHolder方法中創建您的視圖。最後,叫你在你的共享類的Viewholder的點擊界面中定義的接口:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{ 

    private OnRecyclerItemClickedListener onRecyclerItemClickedListener; 

    public MyRecyclerViewAdapter(List<Item> items, int rowLayout, Context context, OnRecyclerItemClickedListener onRecyclerItemClickedListener){ 
     this.items = items; 
     this.rowLayout = rowLayout; 
     this.mContext = context; 
     this.onRecyclerItemClickedListener = onRecyclerItemClickedListener; 
    } 



    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false); 
     ViewHolder holder = new ViewHolder(v, new ViewHolder.ViewHolderClickListener() { 

     @Override 
     public void onItemClick(View caller, int position) { 
      onRecyclerItemClickedListener.onRecyclerItemClicked(put_parameters_if_you_want); 
     }}); 
     return holder; 
    } 

} 

這是一個有點複雜,但這裏是你做什麼的解釋:當按鈕被點擊,你按一下按鈕監聽電話另一個偵聽器(在您的視圖中定義),並且該偵聽器調用在您的片段中實現的另一個偵聽器。

這就是你需要做的。

0

,您可以檢查的意見ID和火根據被點擊,其針對不同聽衆的點擊。 like

comment_btn.setOnClickListener(this); 
anotherButton.setOnClickListener(this); 

switch (v.getId()) 

case R.id.comment_btn: 
     code goes here 

case R.id.another_button: 

希望對您有所幫助。

+0

我也試過。但它只返回整個項目的ID。 –

+0

而不是在視圖持有者中實現View.OnClickListener。爲單個項目創建點擊監聽器,然後嘗試。 –

0

@Override 
public void onClick(View v) { 
    if(view.getId() == comment_btn.getId()){ 
     Log.d("LOGTAG","Bingo !!! Your view Clicked."); 
    } 
    if (clickListener != null) { 
     clickListener.onItemClicked(getPosition(), v.getTag().toString()); 
    } 
} 
相關問題