2017-07-01 134 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 
    }); 
}