2015-05-05 3 views
0

Я использую базовый адаптер и заполняю различные компоненты каждого элемента списка соответствующими элементами разных списков массивов. Я использую следующий код:Ссылка на нулевой объект Android в базовом адаптере

public class OfflineAdapter extends BaseAdapter { 

static Context context; 
static int layoutResourceId; 
ArrayList<String> qid = new ArrayList<String>(); 
ArrayList<String> author = new ArrayList<String>(); 
ArrayList<String> title = new ArrayList<String>(); 
ArrayList<String> vote = new ArrayList<String>(); 

public OfflineAdapter(Context c,int layoutResourceId,ArrayList<String> qid,ArrayList<String> author,ArrayList<String> title,ArrayList<String> vote) 
{ 

    //super(c,layoutResourceId,qid,author,title,vote); 
    this.context = c; 
    this.layoutResourceId = layoutResourceId; 
    this.qid = qid; 
    this.author = author; 
    this.title = title; 
    this.vote = vote; 
} 

@Override 
public int getCount() { 
    return 20; 
} 

@Override 
public Object getItem(int position) { 
    return qid.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    QuestionHolder holder = null; 
    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new QuestionHolder(); 
     holder.txtTitle = (TextView)row.findViewById(R.id.questionTitle); 
     holder.txtTitle2 = (TextView)row.findViewById(R.id.questionAuthor); 
     holder.txtTitle3 = (TextView)row.findViewById(R.id.questionVotes); 
     holder.txtTitle4 = (TextView)row.findViewById(R.id.questionID); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (QuestionHolder)row.getTag(); 
    } 
    //Question hold = data[position]; 
    //if(hold!=null) { 
     holder.txtTitle.setText(Html.fromHtml(title.get(position))); 
     holder.txtTitle2.setText(author.get(position)); 
     holder.txtTitle3.setText(vote.get(position)); 
     holder.txtTitle4.setText(qid.get(position)); 
    //} 
    return row; 
} 

static class QuestionHolder 
{ 
    TextView txtTitle; 
    TextView txtTitle2; 
    TextView txtTitle3; 
    TextView txtTitle4; 
} 

Но я получаю следующее сообщение об ошибке:

попытка вызвать виртуальный метод 'java.lang.Object java.util.ArrayList.get (INT)' на нулевой объект ссылки

на этой линии:

  holder.txtTitle.setText(Html.fromHtml(title.get(position))); 

Что может быть причина? Я инициализировал все списки массивов, и ни один из них не имеет значения null.

Спасибо!

+0

Вам следует использовать метод qid.size() как метод getCount(). –

+0

Как вы называете этот адаптер? Можете ли вы опубликовать этот код и посмотреть, имеет ли значение 'ArrayList title' значение? Потому что, поскольку ваше исключение говорит, что ваш «список заголовков» не имеет никакого значения. – BBdev

+0

Offtopic: у вас могут быть какие-либо проблемы здесь, но всякий раз, когда я вижу «статический контекст контекста», я знаю, что он задает проблемы. – wujek

ответ

3

Прежде всего, для чистого кода и лучшей практики программирования, вместо того чтобы создавать 4 списков строк, как вы делали:

ArrayList<String> qid = new ArrayList<String>(); 
ArrayList<String> author = new ArrayList<String>(); 
ArrayList<String> title = new ArrayList<String>(); 
ArrayList<String> vote = new ArrayList<String>(); 

создать Object с теми 4 параметров (QID, автором, название, голосование)

public class YourObject implements Serializable{ 
public String qid; 
public String author; 
public String title; 
public String vote; 
} 

и передать один список этого объекта к adapter;

ArrayList<YourObject> objList = new ArrayList<YourObject>(); 

Тогда на getCount() метод возвращения objList.size()

+0

Хотелось бы получить список, чтобы иметь только первые 20 элементов. Вот почему я вернул 20 в getCount(). Правильно ли это? – Apple

+0

Затем создайте 'tmpList', отфильтруйте 20 элементов и добавьте их в этот список. Затем отправьте« адаптер ». Вы должны сначала прочитать, как работает «адаптер» – hrskrs

+0

Прохождение 20 к getCount() работает так же хорошо. – Apple

0

Вы настроите все ArrayLists, но тогда вы не используете их, вы используете все, что получает передается в конструктор. Список названий, скорее всего, будет нулевым, потому что вы передаете null в конструкторе. Проверьте, как вызывается конструктор вашего адаптера и какие ссылки передаются.