2016-09-03 1 views
0

Я создал пользовательских ListView с одним ImageView и один TextView. Я также создал пользовательский адаптер от ArrayAdapter, и я использовал массив классов (MonsterLink []), чтобы получить всю информацию об адаптере. Но ListView все еще повторяет одну строку. Я попытался найти решение здесь (и я сделал это с помощью setTag, getTag), но он не помог, и я этого не понимаю. Это мое первое приложение.Пользовательские ListView повторяет одну строку

CreateView где я называю адаптер: @Override общественности Посмотреть onCreateView (LayoutInflater инфлятор, ViewGroup контейнер, Bundle savedInstanceState) {// вид нагрузки this.MyView = inflater.inflate (R.layout.fragment_list, контейнер ,ложный);

//Change the category label 
    SetCategoryLabel(); 

    //Load DB; 
    LoadDatabase(); 

    //Create list for MonsterList 
    MonsterLink[] MonsterLinkList = LoadMonsterLinkList(); 
    MonsterAdapter monsteradapter = new MonsterAdapter(this.getContext(), MonsterLinkList); 
    ListView MonsterList = (ListView) MyView.findViewById(R.id.list_Monsters); 
    MonsterList.setAdapter(monsteradapter); 

    // Inflate the layout for this fragment 
    return this.MyView; //inflater.inflate(R.layout.fragment_list, container, false); 
} 

Мой адаптер:

public class MonsterAdapter extends ArrayAdapter<MonsterLink> { 

public MonsterAdapter(Context context, MonsterLink[] MonsterNames) { 
    super(context, R.layout.monster_row, MonsterNames); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder mHolder; 

    // Get the data item for this position 
    MonsterLink monster = getItem(position); 
    // Check if an existing view is being reused, otherwise inflate the view 
    if (convertView == null){ 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.monster_row,parent,false); 
     mHolder = new ViewHolder(); 

     /**TextView MonsterName = (TextView) convertView.findViewById(R.id.txt_MonsterName); 
     ImageView MonsterPic = (ImageView) convertView.findViewById(R.id.img_MonsterPic);**/ 

     mHolder.mName = (TextView) convertView.findViewById(R.id.txt_MonsterName); 
     mHolder.mPic = (ImageView) convertView.findViewById(R.id.img_MonsterPic); 

     convertView.setTag(mHolder); 


    }else { 
     mHolder = (ViewHolder) convertView.getTag(); 
    } 



    mHolder.mName.setText(monster.getName()); 

    return convertView; 

} 

private class ViewHolder{ 
    private TextView mName; 
    private ImageView mPic; 
} 

}

Как я сказал, что это мой первый приложение на Android, и я действительно не понимаю, как ViewHolder адаптер работает.

EDIT - Новый адаптер Мой адаптер теперь выглядит следующим образом:

public class MonsterAdapter extends BaseAdapter { 
@Override 
public int getCount() { 
    return monsterList.size(); 
} 

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

@Override 
public Object getItem(int position) { 
    return null; 
} 

ArrayList<MonsterLink> monsterList; 
Context context; 

public MonsterAdapter(Context context, ArrayList<MonsterLink> MonsterNames) { 
    this.monsterList = MonsterNames; 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 
    MonsterLink monster = monsterList.get(position); 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.monster_row,parent,false); 

    TextView name = (TextView) convertView.findViewById(R.id.txt_MonsterName); 
    ImageView pic = (ImageView) convertView.findViewById(R.id.img_MonsterPic); 
    name.setText(monster.getName()); 
    return convertView; 

} 

}

Я не могу видеть, какие строки в настоящее время

ответ

1

Попробуйте продлив адаптер из класса

BaseAdapter

А также, попробуйте сделать локальный список массива MonsterLink содержит список в адаптере Гадания вы не собираетесь показывать тонны данных, это нормально, если вы не втягиваете свои взгляды, потому что, если те что вы хотите, я настоятельно рекомендую вам RecyclerView.

Попробуйте следующее (не проверено):

public class MonsterAdapter extends BaseAdapter { 

     ArrayList<MonsterLink> monsterList; 
     Context context; 
     public MonsterAdapter(Context context, MonsterLink[] MonsterNames) { 
      this.monsterList = MonsterNames; 
      this.context = context; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 
      MonsterLink monster = monsterList.get(position); 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.monster_row,parent,false); 

     /**TextView MonsterName = (TextView) convertView.findViewById(R.id.txt_MonsterName); 
     ImageView MonsterPic = (ImageView) convertView.findViewById(R.id.img_MonsterPic);**/ 

     TextView name = (TextView) convertView.findViewById(R.id.txt_MonsterName); 
     ImageView pic = (ImageView) convertView.findViewById(R.id.img_MonsterPic); 
     //name.setText('bla bla') 
     //name.setText(monster.getName()) 
     return convertView; 

     } 


     @Override 
     public int getCount() { 
      return monsterList.size(); 
     } 
+0

Что вы имеете в виду? Вы можете видеть, что Im отправляет MonsterLink [] MonsterNames в качестве параметра адаптера. Этот массив уже заполнен.Внутри MonsterLink [] У меня есть два объекта (два имени), но ListView показывает одно и то же имя в каждой строке. – Somachr

+0

Работы? @Somachr – Firecat

+0

Нет, я не могу пройти через супер (контекст); в нем говорится, что я не могу использовать контекст здесь. – Somachr

0

Благодаря @Firecat я (мы) был расположен, что ошибка не в адаптере, но когда список элементов создаются. Затем этот список отправляется в адаптер.

while (cursor.moveToNext()){ 
      List.add(new MonsterLink(cursor.getString(0),cursor.getString(1),cursor.getString(2))); 
     } 
     cursor.close(); 

Это будет нормально работать нормально, но мой объект MonsterLink содержал следующее:

public class MonsterLink { 

private Static String Name; 
private Static String PicPath; 
private Static String MonsterID; 

I shouldn't есть использовать статические переменные! Каждый раз, когда я создал новый MonsterLink, я изменил эти три переменные для каждого объекта в массиве.