6

Ich erstelle einen Twitter-Client mit Fabric, aber ich kann keine benutzerdefinierte onClick erstellen. Ich habe diesen benutzerdefinierten Adapter erstellt und versucht, einen OnClickListener zu erstellen, der jedoch nicht funktioniert. Immer im Browser Tweet öffnen.Kann ich benutzerdefinierte onClick auf meiner Timeline mit Fabric SDK festlegen?

public class TweetAdapter extends TweetTimelineListAdapter { 

    public ArrayList<Long> tweetIds=new ArrayList<Long>(); 
    public TweetAdapter(Context context, Timeline<Tweet> timeline) { 
     super(context, timeline); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Object rowView = convertView; 
     final Tweet tweet = (Tweet)this.getItem(position); 
     if(convertView == null) { 
      rowView = new CompactTweetView(this.context, tweet); 
     } else { 
      ((BaseTweetView)convertView).setTweet(tweet); 
      ((View)rowView).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        tweetIds.add(tweet.getId()); 
       } 
      }); 
     } 
     return (View)rowView; 
    } 
} 

In BaseTweetView Klasse ist es die Funktion Typ OnClickListener aber in diesem Fall kann ich nicht von irgendeiner Idee denken, zu überschreiben.

private void setPermalinkLauncher() { 
    BaseTweetView.PermalinkClickListener listener = new BaseTweetView.PermalinkClickListener(); 
    this.setOnClickListener(listener); 
    this.contentView.setOnClickListener(listener); 
} 

class PermalinkClickListener implements OnClickListener { 
    PermalinkClickListener() { 
    } 

    public void onClick(View v) { 
     if(BaseTweetView.this.getPermalinkUri() != null) { 
      BaseTweetView.this.scribePermalinkClick(); 
      BaseTweetView.this.launchPermalink(); 
     } 
    } 
} 

Irgendwelche Ideen? Danke

Antwort

5

Schließlich habe ich das funktioniert mit einem benutzerdefinierten Adapter (sehr ähnlich, dass die, die Sie in der Frage verwenden). Dieser Adapter erhält die resultierende Ansicht von Super-Implementierung und fügt einen OnClickListener die Stoffstandardwerte außer Kraft setzt ein:

class CustomTweetTimelineListAdapter extends TweetTimelineListAdapter { 

    public CustomTweetTimelineListAdapter(Context context, Timeline<Tweet> timeline) { 
     super(context, timeline); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 

     //disable subviews to avoid links are clickable 
     if(view instanceof ViewGroup){ 
      disableViewAndSubViews((ViewGroup) view); 
     } 

     //enable root view and attach custom listener 
     view.setEnabled(true);    
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String tweetId = "click tweetId:"+getItemId(position); 
       Toast.makeText(context, tweetId, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return view; 
    } 

    //helper method to disable subviews 
    private void disableViewAndSubViews(ViewGroup layout) { 
     layout.setEnabled(false); 
     for (int i = 0; i < layout.getChildCount(); i++) { 
      View child = layout.getChildAt(i); 
      if (child instanceof ViewGroup) { 
       disableViewAndSubViews((ViewGroup) child); 
      } else { 
       child.setEnabled(false); 
       child.setClickable(false); 
       child.setLongClickable(false); 
      } 
     } 
    } 

} 

Vollcodebeispiel here.

Hoffe es hilft.

+0

So deaktivieren Sie alle Klicks, die zum Ändern der Methode erforderlich sind: 'private void disableViewAndSubViews (Layout der Ansichtsgruppe) { layout.setEnabled (false); für (int i = 0; i pablogupi

+0

Ich aktualisiere das gist Beispiel und antworte mit deinem Vorschlag;) – sabadow

+0

irgendwelche Ideen, wie man dies ohne die Erweiterung TweetTimeLineListAdapter machen kann? Ich habe den obigen Code ausprobiert, aber es funktioniert nicht für mich. Ich erstelle ein Tweet-Objekt und füge es in ein FrameLayout ein, das die Zeile der Liste ist. Ich muss einen auswählen, ohne Standard-Tweet-Aktionen aufzurufen. – SavageKing