2017-07-01 132 views
-3

我的項目基於片段,我試圖實現HypeLabs網狀網絡聊天作爲額外的功能。如何將附加URL中顯示的Hype Labs Github項目中的活動轉換爲諸如ChatFragment和ContactsFragment之類的片段。從ListView適配器轉換爲RecyclerView適配器的片段

原來ContactsViewAdapter如下:

public class DirectContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
protected final Activity mActivity; 
private Map<String, Store> stores; 

public DirectContactsAdapter(@NonNull Activity mActivity, Map<String, Store> stores) { 
    this.mActivity = mActivity; 
    this.stores = stores; 
} 

protected Map<String, Store> getStores() { 
    return stores; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView; 
    itemView = LayoutInflater.from(mActivity).inflate(R.layout.row_direct_contacts, parent, false); 
    return new DirectContactsViewHolder(itemView); 

} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    if(holder instanceof DirectContactsViewHolder) { 
     final DirectContactsViewHolder directContactsHolder = (DirectContactsViewHolder) holder; 
     final Store contactsStore = this.stores.get(position); 
     try { 
      directContactsHolder.displayName.setText(contactsStore.getInstance().getRealmStringIdentifier()); 
      directContactsHolder.contentIndicator.setVisibility(contactsStore.hasNewMessages 
        () ? View.VISIBLE : View.INVISIBLE); 

      holder.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

          Intent intent = new Intent(DirectContactsFragment.this, DirectChatsFragment 
            .class); 

          TextView displayName = (TextView) view.findViewById(R.id.display_name); 
          CharSequence charSequence = displayName.getText(); 

          setDisplayName(charSequence.toString()); 

          Store store = chatApplication.getStores().get(getDisplayName()); 
          store.setDelegate(contactActivity); 

          intent.putExtra(ChatActivity.INTENT_EXTRA_STORE, store.getInstance().getStringIdentifier()); 

          startActivity(intent); 
         } 
      }); 
     } catch (Exception e) { 
      AppHelper.LogCat("Contacts adapters Exception " + e.getMessage()); 
     } 
    } 

} 


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

public Store getItem(int position) { 
    return stores.get(position); 
} 


public class DirectContactsViewHolder extends RecyclerView.ViewHolder { 
    @BindView(R.id.avatar) 
    ImageView userImage; 
    @BindView(R.id.display_name) 
    TextView displayName; 
    @BindView(R.id.new_content) 
    ImageView contentIndicator; 

    DirectContactsViewHolder(View itemView) { 
     super(itemView); 
     ButterKnife.bind(this, itemView); 
    } 

}} 

我很新的片段和Android Studio生成進一步迷惑我的例子。

任何幫助,高度讚賞。

+0

究竟什麼是烏拉圭回合的問題:這樣做ü應該實現這個片段後界面

public class DirectContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private IItemClickListener mListener; public void setListener(IItemClickListener listener) {mListener=listener;} ... public DirectContactsAdapter(@NonNull Activity mActivity, Map<String, Store> stores) { // this is the bad practice to pass Activity object, better pass Context this.mActivity = mActivity; this.stores = stores; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof DirectContactsViewHolder) { final DirectContactsViewHolder directContactsHolder = (DirectContactsViewHolder) holder; final Store contactsStore = stores.get(position); try { directContactsHolder.displayName.setText(contactsStore.getInstance().getRealmStringIdentifier()); directContactsHolder.contentIndicator.setVisibility(contactsStore.hasNewMessages () ? View.VISIBLE : View.INVISIBLE); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TextView displayName = (TextView) view.findViewById(R.id.display_name); // this is redundant cause u use butterknife and ur ViewHolder already have reference to its TextView CharSequence charSequence = displayName.getText(); // u should use DirectContactsViewHolder.displayName.getText() instead setDisplayName(charSequence.toString()); Store store = chatApplication.getStores().get(getDisplayName()); store.setDelegate(contactActivity); if(mListener != null) mListener.onItemClicked(store.getInstance().getStringIdentifier()); } }); } catch (Exception e) { AppHelper.LogCat("Contacts adapters Exception " + e.getMessage()); } } } public interface IItemClickListener { void onItemClicked(String identifier); } 

?你想要什麼?你的適配器似乎是正確的..但你必須在onBindViewHolder方法中放一些代碼來顯示 – borune

+0

Hello @borune感謝您的評論。是的RecyclerViewAdapter似乎是正確的,但ListViewAdapter中還有一些尚未實現的東西,例如onTouch事件,它打開另一個傳遞一些數據的Activity。我也知道我不能在碎片中使用意圖,所以我該如何解決這個問題。到目前爲止,這是我基於Google的一些研究成果。我上面更新了我的代碼。 –

回答

0

@Victor是否想將某些數據從urler適配器傳遞給Fragment而不是Activity?如果是這樣,你應該使用回調模式。對於這樣做ü可以按如下方式創建一個封閉的接口類:

class YourFragment extends Fragment { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 

    DirectContactsAdapter adapter = new DirectContactsAdapter(...); 
    adapter.setListener(new DirectContactsAdapter.IItemClickListener() { 
     @Override 
     void onItemClicked(String identifier) { 
      //do what u want with identifier 
    }); 
}