2015-04-19 3 views
0

Я немного потерял заполнение ListView из списка. Я могу заполнить его одним элементом, но хочу получить три элемента из объекта, поэтому, когда я касаюсь каждого элемента, приложение переходит к содержащейся в нем ссылке. В моем фактическом коде я просто могу показать заголовокListView OnClick с заполнением

protected void onPostExecute (Boolean result){ 

      List <String> title = new ArrayList<String>(); 
      List <String> link = new ArrayList<>(); 
      List <String> date = new ArrayList<>(); 
      for(int i=0;i<news.size();i++) 
      { 
       title.add(news.get(i).getTitle()); 
       link.add(news.get(i).getLink()); 
       date.add(news.get(i).getDate()); 
      } 
      ArrayAdapter <String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,title); 
      result.setAdapter(adapter); 
      dialog.dismiss(); 
     } 

В ArrayListdate и link, я сохранить правильные данные, но я просто не могу использовать один из них. Мое намерение - поставить дату под заголовком, и когда вы касаетесь каждого элемента, браузер открывается с выбранной ссылкой.

Большое спасибо.

EDIT: Я сделал пользовательский адаптер, но это дает мне ошибку.

class CustomAdapter extends ArrayAdapter<whatsnew> { 

      public CustomAdapter(Context context, whatsnew[] data) { 
       super(context, R.layout.listitem, data); 
      } 

      public View getView(int position, View convertView, ViewGroup parent) { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       View item = inflater.inflate(R.layout.listitem, null); //This give me a warning 

       TextView lblTitle = (TextView)item.findViewById(R.id.lbltitle); 
       lblTitle.setText(data[position].getTitle()); 

       TextView lbldate = (TextView)item.findViewById(R.id.lbldate); 
       lbldate.setText(data[position].getFecha()); 

       return(item); 

      } 

     } 
     CustomAdapter adaptader = new CuestomAdapter(getActivity(), data); 
     result.setAdapter(adaptador); 
     dialog.dismiss(); 

Мой Logcat говорит:

Java NullPointerException: storage == null 

Решение изменить «WhatsNew [] данные» по «списку данных» в методе общественного CustomAdapter, так как у меня есть все данные в ArrayList по имени данных.

+0

Возможный дубликат [Пользовательский адаптер для просмотра списка] (http://stackoverflow.com/questions/8166497/custom-adapter-for-list-view) –

+0

Нет, просто я помещаю код здесь, решена. Спасибо за совет. Адаптер отлично работает и заполняет ListView с помощью элемента Title. Но я хочу добавить дату и ссылку в ListView, и это проблема – user1423168

ответ

1

Не используйте список строк, лучшим решением будет использовать независимый класс, который устанавливает и получить эти три переменные, давайте назовем этот класс (к примеру) данных:

public class Data{ 
private String title; 
private String link; 
private String date; 
//define getters and setters here 
} 

затем использовать объект данных типа в списке:

List <Data> data = new ArrayList<Data>(); 

вы также должны сделать пользовательский адаптер, который расширяет данные:

public class ImageAdapter extends ArrayAdapter<Data>{ 



Context context; 
    int layoutResourceId; 

ArrayList<Data> data=new ArrayList<Data>(); 
public ImageAdapter(Context YourClass, int layoutResourceId, ArrayList<Data> data) { 
    super(YourClass, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = YourClass; 
    this.data = data; 
} 




@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ImageHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ImageHolder(); 
     holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 
     holder.txtlink = (TextView)row.findViewById(R.id.txtTitle1); 
     holder.txtDate = (TextView)row.findViewById(R.id.txtTitle1); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ImageHolder)row.getTag(); 
    } 

    Data d = data.get(position); 
    holder.txtTitle.setText(d.getTitle()); 
    holder.txtLink.setText(d.getLink()); 
    holder.txtDate.setText(d.getDate()); 


    return row; 

} 

static class ImageHolder 
{ 
    ImageView imgIcon; 
    TextView txtTitle; 
    TextView txtTitle1; 

} 


} 

затем создать это:

ImageAdapter adapter1 = new TicketsImageAdapter(getActivity(), 
        R.layout.photo_list_adapter, data); 

и вы установите ListView в этот адаптер:

dataList.setAdapter(adapter1); 

Что касается NullPointerException: -Первые всего вы, чтобы инициализировать ВАР внутри вашего customAdapter конструктора во-вторых, вам нужно разделить между макетом listview и listItems, чтобы создать новый xml, который содержит listItems-> tvTitle, tvLink, tvDate , - тогда вам нужно сделать условие, что getView не возвращает View = null как i ' в приведенном выше коде надеюсь, что это сработает для вас. Удачи

+0

Спасибо, но у меня уже есть внешний класс с определением данных с именем whatsnew. Но я не могу сделать пользовательский адаптер внутри OnPostExecute. Или просто не знаю, так что мне пора читать – user1423168

+0

, если он устанавливает заголовок, что означает, что он работает внутри onpost(), но проблема в том, что вы просто даете ему название через эту строку: (getActivity(), android .R.layout.simple_list_item_1, название); поэтому создание пользовательского адаптера позволит исправить это. –

+0

Отредактировано. Я получаю ошибки с адаптером ... NullPointerException и не вижу ошибки.Спасибо – user1423168

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