2017-07-01 1 views
-3

Mein Projekt basiert auf Fragmenten und ich versuche HypeLabs Mesh Network Chat als zusätzliche Funktionalität zu implementieren. Wie konvertiere ich die Aktivitäten im Hype Labs Github-Projekt, die in der angehängten URL angezeigt werden, in Fragmente wie ChatFragment und ContactsFragment.Konvertieren von ListView Adapter zu RecyclerView Adapter für Fragmente

Die ursprüngliche ContactsViewAdapter ist wie folgt:

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

}} 

Ich bin ganz neu in Fragmente und die Beispiele Android Studio weiter verwirren mich erzeugt.

Jede Hilfe wird sehr geschätzt.

+0

so was ist ur Problem? Was willst du? Dein Adapter scheint korrekt zu sein ... aber du musst Code in die bindViewHolder-Methode einfügen, um etwas anzuzeigen – borune

+0

Hallo @borune, danke für deinen Kommentar. Ja, der RecyclerViewAdapter scheint korrekt zu sein, aber es gibt etwas im ListViewAdapter, das nicht implementiert wurde, zum Beispiel das onTouch-Ereignis, das eine andere Aktivität öffnet, die einige Daten weitergibt. Ich weiß auch, dass ich in Fragments keine Absicht verwenden kann, also wie löse ich das. Bisher habe ich das auf Google-Recherchen basiert. Ich habe meinen obigen Code aktualisiert. –

Antwort

0

@Victor möchten Sie einige Daten von Ihrem Adapter an das Fragment anstelle der Aktivität übergeben? Wenn ja, sollten Sie das Callback-Muster verwenden. Dafür, dass u eine umschließende Interface-Klasse erstellen können wie folgt:

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

nach tun, dass u diese Schnittstelle in Fragment implementieren sollten:

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