2017-07-01 7 views
-3

私のプロジェクトはフラグメントに基づいており、HypeLabsメッシュネットワークチャットを追加機能として実装しようとしています。添付のURLに示されているHype Labs Github Projectのアクティビティを、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

をそうウル問題は何ですか?なんでしょう?あなたのアダプタは正しいようです。しかし、何かを表示するためにonBindViewHolderメソッドにいくつかのコードを入れなければなりません。 – borune

+0

あなたのコメントのために、こんにちは@ボルンありがとう。うん、RecyclerViewAdapterは正しいようですが、実装されていないListViewAdapterには何かがあります。たとえば、onTouchイベントのように、別のアクティビティがいくつかのデータを渡すようになっているようです。私はフラグメントの意図を使用することができないことも知っているので、どうすればこの問題を解決できますか?これまでのところ、私はGoogleのいくつかの調査に基づいています。上記のコードを更新しました。 –

答えて

0

@Victor ur adaptorからのデータをActivityではなくFragmentに渡したいのですか?その場合は、コールバックパターンを使用する必要があります。

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); 
    } 

をuが断片でこのインターフェイスを実装する必要があることを実行した後:次のようにuが囲んでいるインタフェースクラスを作成することができることを行うための

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 
    }); 
} 
関連する問題