2016-04-04 4 views
-4

Я пытаюсь изменить значок пользовательского списка, но он продолжает сбой. Как изменить значок для каждой страницы? например:Изменить значок в списке

Я попытался добавить значок в Forloop, но это просто заставляет его сбой, я также попытался выполнить его, но не смог найти ничего, что исправило бы мою проблему. Также я только недавно начал разрабатывать Android. Так что я не знаю об этом много.

Это текстовая страница, на которой установлен значок в виде текстового значка.

Text Page

Это «Новости страницы» я хотел бы, чтобы иметь значок новостей, но теперь его так:

News Page

Это мой код, который я использовать для создания «Текстовой страницы»

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

Пользовательский адаптер код (где я объявили значок):

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

Что вы пробовали? Можете ли вы опубликовать журнал? –

+0

@YasirTahir Я попробовал добавить значок в цикле For, но он просто продолжает рушиться, я новый для android, поэтому у меня нет много опыта с этим материалом, как я могу опубликовать журнал? Вы имеете в виду код, который генерируется, когда я нажимаю кнопки на эмуляторе? Я также попытался google моя проблема, но не смог найти, что моя проблема исправлена ​​на любой странице. – Robbert

+0

На странице новостей вы используете тот же код, что и на тестовой странице? Брат, простое решение, когда ваша модель одинакова для обоих, состоит в том, чтобы иметь два разных адаптера один для списка тестовых страниц и другой для списка новостей.И немного сложное решение состоит в том, чтобы иметь две дополнительные поля в вашей модели и на основе этого решить, какое изображение отображать в этом случае. –

ответ

1

Чтобы ответить на ваш вопрос, да, есть лучший способ реализовать одно и то же. Например, если для новостей и тестовой страницы, модель такая же, вы можете добавить один дополнительный параметр, как:

public class CustomListView { 

// Along with your other properties 

private boolean isTestPage; 

public boolean isTestPage() { 
    return isTestPage; 
} 

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

И тогда вы можете использовать один и тот же CustomAdapter,

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

Другое решение, когда ваша модель не то же самое для обоих из двух, то вы можете создать интерфейс с именем CustomInterface и реализовать его для обеих ваших моделей. Затем адаптер, вместо модели, используйте CustomInterface и в вашем GetView, вы должны проверить текущую модель, как:

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

Помните, что список работает только для однородных коллекций. Если у вас гетерогенная коллекция, вы можете реализовать интерфейс на всех моделях и составить список интерфейса, а затем можете поместить любую модель в этот список, который реализует тот же интерфейс.

Но это действительно сложное решение. Простой и лучший подход состоит в том, чтобы иметь разные адаптеры для разных видов.

0

Я просто дублирует класс CustomAdapter, я просто думал, что лучше и чище, чем способ просто скопировать склеивание.

Смежные вопросы