2016-04-04 5 views
-4

Ich versuche, das Symbol der benutzerdefinierten Listenansicht zu ändern, aber es stürzt ständig ab. Wie ändere ich das Symbol für jede Seite? zum Beispiel:Ändern Sie das Symbol in der Listenansicht

Ich habe versucht, das Symbol in der Forloop, aber das macht es nur zum Absturz, ich habe auch versucht, es google, aber konnte nichts finden, das mein Problem behoben. Auch ich habe erst vor kurzem begonnen, Android zu entwickeln. Also habe ich nicht viel Wissen darüber.

Dies ist die "Textseite", die das Symbol als Textsymbol enthält.

Text Page

Dies ist die "News-Seite" Ich möchte den Nachrichten-Symbol haben, aber seine jetzt wie folgt aus:

News Page

Dies ist mein Code, den ich Verwenden Sie, um die "Textseite" zu generieren

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.comp_cont_bar); 

    ListView lv = (ListView) findViewById(R.id.lv1); 
    registerForContextMenu(lv); 

    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipelayout); 

    mSwipeRefreshLayout.setOnRefreshListener(
      new SwipeRefreshLayout.OnRefreshListener() { 
       @Override 
       public void onRefresh() { 
       finish(); 
       startActivity(getIntent()); 
       } 
      } 
    ); 

    try { 
    APIClient api = new APIClient(); 
    JSONArray result = null; 

    try { 
     result = api.execute("http://test.soundwave.drieo.nl/api/content" + apikey).get(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    List<CustomListView> contents = new ArrayList<CustomListView>(); 

    for(int i = 0; i < result.length(); i++){ 
     try { 
      JSONObject row = result.getJSONObject(i); 

      String content = row.optString("FormattedName"); 
      String content2 = row.optString("CreatedBy"); 
      String content3 = row.optString("Id"); 

      CustomListView item = new CustomListView(); 

      item.firstLine = content; 
      item.description = content2; 
      item.ID = content3; 

      contents.add(item); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

     ListAdapter theAdapter = new CustomAdapter(MainComp_Content.this, contents); 
     ListView theListView = (ListView) findViewById(R.id.lv1); 
     theListView.setAdapter(theAdapter); 

     theListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 

       TextView textView = (TextView) view.findViewById(R.id.tbid); 
       UID = textView.getText().toString(); 

       Intent intent = new Intent(MainComp_Content.this, MainComp_Content_edit.class); 
       intent.putExtra("uid", UID); 
       startActivity(intent); 
      } 
     }); 

     theListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       TextView textView = (TextView) view.findViewById(R.id.tbid); 
       UID = textView.getText().toString(); 
       return false; 
      } 
     }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Individuelle Adaptercode (wobei i das Symbol erklärt haben):

package nl.drieo.soundwave.test.cms; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.List; 

public class CustomAdapter extends ArrayAdapter<CustomListView> { 
public CustomAdapter(Context context, List<CustomListView> contents) { 
    super(context, R.layout.custom_row, contents); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater theInflater = LayoutInflater.from(getContext()); 

    View theView = theInflater.inflate(R.layout.custom_row, parent, false); 

    CustomListView tvFirstItem = getItem(position); 

    TextView theTextView = (TextView) theView.findViewById(R.id.firstLine); 
    theTextView.setText(tvFirstItem.firstLine); 

    TextView theTextView2 = (TextView) theView.findViewById(R.id.secondLine); 
    theTextView2.setText(tvFirstItem.description); 

    TextView theTextView3 = (TextView) theView.findViewById(R.id.tbid); 
    theTextView3.setText(tvFirstItem.ID); 

    ImageView theImageView = (ImageView) theView.findViewById(R.id.icon); 
    theImageView.setImageResource(R.drawable.ic_content); 

    return theView; 
} 
} 
+0

Was haben Sie bisher versucht? Können Sie das Protokoll posten? –

+0

@YasirTahir Ich habe versucht, das Symbol in der For-Schleife hinzuzufügen, aber es stürzt immer auf mich, ich bin neu auf Android, so habe ich nicht viel Erfahrung mit diesem Zeug, wie poste ich das Protokoll? Meinst du den Code, der generiert wird, wenn ich auf Schaltflächen auf dem Emulator klicke? Ich habe auch versucht, mein Problem zu googeln, konnte aber nicht feststellen, dass mein Problem auf irgendeiner Seite behoben wurde. – Robbert

+0

Verwenden Sie für die News-Seite denselben Code wie für die Testseite? Brother, einfache Lösung, wenn Ihr Modell für beide gleich ist, ist zwei verschiedene Adapter eine für die Testseitenliste und andere für die News-Seitenliste zu haben.Eine etwas kompliziertere Lösung besteht darin, zwei zusätzliche Felder in Ihrem Modell zu haben und basierend darauf festzulegen, welches Bild in welchem ​​Fall angezeigt werden soll. –

Antwort

1

Um Ihre Frage zu beantworten, Ja gibt es bessere Möglichkeit, die gleiche Sache zu implementieren. Wenn zum Beispiel für Nachrichten und Testseite, Modell gleich ist, können Sie einen zusätzlichen Parameter wie hinzufügen:

public class CustomListView { 

// Along with your other properties 

private boolean isTestPage; 

public boolean isTestPage() { 
    return isTestPage; 
} 

public void setIsTestPage(boolean isTestPage) { 
    this.isTestPage = isTestPage; 
} 
} 

Und dann können Sie den gleichen CustomAdapter verwenden,

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater theInflater = LayoutInflater.from(getContext()); 

    View theView = theInflater.inflate(R.layout.custom_row, parent, false); 

    CustomListView tvFirstItem = getItem(position); 

    TextView theTextView = (TextView) theView.findViewById(R.id.firstLine); 
    theTextView.setText(tvFirstItem.firstLine); 

    TextView theTextView2 = (TextView) theView.findViewById(R.id.secondLine); 
    theTextView2.setText(tvFirstItem.description); 

    TextView theTextView3 = (TextView) theView.findViewById(R.id.tbid); 
    theTextView3.setText(tvFirstItem.ID); 

    ImageView theImageView = (ImageView) theView.findViewById(R.id.icon); 

    if (tvFirstItem.isTestPage()) { 
     // Test Page Image 
     theImageView.setImageResource(R.drawable.ic_test_page); 
    } else{ 
     // News Page Image 
     theImageView.setImageResource(R.drawable.ic_news_page); 
    } 

    return theView; 
} 

Andere Lösung, wenn Ihr Modell ist nicht das gleiche für beide, dann können Sie ein Interface mit dem Namen CustomInterface erstellen und es für beide Ihrer Modelle implementieren. Dann in den Adapter, anstelle des Modells verwenden Custom und in Ihrem getView, müssen Sie das aktuelle Modell überprüfen wie:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater theInflater = LayoutInflater.from(getContext()); 
    View theView = theInflater.inflate(R.layout.custom_row, parent, false); 
    if(entity instanceof Obj1){ 
     // Test Page 
    } else if(entity instanceof Obj2){ 
     // News Page 
    } 
    return theView; 
} 

Denken Sie daran, dass, arbeitet Liste nur für homogene Sammlungen. Wenn Sie eine heterogene Sammlung haben, können Sie die Schnittstelle für alle Modelle implementieren und eine Liste der Schnittstelle erstellen und dann ein beliebiges Modell in diese Liste einfügen, die die gleiche Schnittstelle implementieren.

Aber das ist wirklich eine komplizierte Lösung. Der einfache und bessere Ansatz besteht darin, unterschiedliche Adapter für unterschiedliche Ansichten zu verwenden.

0

ich die CustomAdapter Klasse nur dupliziert, ich dachte nur, war es eine bessere und Weise sauberer als kopieren Einfügen einfach.