Просмотр списка, показывающий избыточные данные в Android

#java #android #android-listview #android-listfragment

#java #Android #android-listview #android-listfragment

Вопрос:

Извините, что снова задаю этот вопрос, но я не получаю никакого решения в предыдущем вопросе, поэтому srry снова я получаю дубликаты данных во время сборки и запуска проекта на эмуляторе вот мой код для

railcode.java

 public class RailCode extends Activity implements OnItemClickListener {

String[] member_names;
String[] contactType;

List<RowCode> rowCode;
ListView mylistview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.railcode);

    rowCode = new ArrayList<RowCode>();

    member_names = getResources().getStringArray(R.array.member_names);


    contactType = getResources().getStringArray(R.array.contactType);

    for (int i = 0; i < member_names.length; i  ) {
        RowCode code = new RowCode(member_names[i],contactType[i]);
        rowCode.add(code);
    }

    mylistview = (ListView) findViewById(R.id.list);
    CustomAdapter adapter = new CustomAdapter(this, rowCode);
    mylistview.setAdapter(adapter);
    mylistview.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
    String member_name = rowCode.get(position).getMember_name();
    Toast.makeText(getApplicationContext(), ""   member_name,
            Toast.LENGTH_SHORT).show();
 }

}
  

CustonAdapter.java

 public class CustomAdapter extends BaseAdapter {

Context context;
List<RowCode> rowItems;

public CustomAdapter(Context context, List<RowCode> rowItems) {
    this.context = context;
    this.rowItems = rowItems;
}

@Override
public int getCount() {
    return rowItems.size();
}

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

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

/* private view holder class */
private class ViewHolder {
    TextView member_name;

    TextView contactType;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_code, null);
        holder = new ViewHolder();

        holder.member_name = (TextView) convertView
                .findViewById(R.id.member_name);
        holder.contactType = (TextView) convertView
                .findViewById(R.id.contact_type);

        RowCode row_pos = rowItems.get(position);

        holder.member_name.setText(row_pos.getMember_name());
        holder.contactType.setText(row_pos.getContactType());

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

}
  

Пожалуйста, помогите мне, я не могу понять, почему он показывает дублирующиеся данные
Заранее спасибо !!!!!1

Комментарии:

1. Переместите строки RowCode и holder.*.setText() в после if-else блока, перед return .

2. пока это не проблема..

3. Спасибо, Майк, я понял это прямо сейчас, никаких избыточных данных 🙂

Ответ №1:

     @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_code, null);
            holder = new ViewHolder();

            holder.member_name = (TextView) convertView
                    .findViewById(R.id.member_name);
            holder.contactType = (TextView) convertView
                    .findViewById(R.id.contact_type);



            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
// put here ..... after else condition
            RowCode row_pos = rowItems.get(position);

            holder.member_name.setText(row_pos.getMember_name());
            holder.contactType.setText(row_pos.getContactType());

    return convertView;
    }
  

Надеюсь, это сработало

Комментарии:

1. майк спрашивает меня раньше, чем вы, и вы должны скопировать ответ

2. @Paresh пожалуйста, проверьте еще раз, вы найдете это.. я поместил код строки row_pos = rowItems.get (позиция); строка вне условия if else.

3. вы не можете поместить RowCode row_pos = rowItems.get(position); строку внутри условия if .. потому что, когда условие if становится ложным, вы получаете дублирующиеся данные………………………………….. предыдущие назначенные данные.

4. майк тоже это сказал, вы можете видеть это в первом комментарии к моему вопросу

5. я не читал его комментарий, я просто проверил его ответ, я нашел ошибку. поэтому я просто исправляю это 🙂

Ответ №2:

общедоступный класс CustomAdapter расширяет BaseAdapter {

 Context context;
List<RowCode> rowItems;

public CustomAdapter(Context context, List<RowCode> rowItems) {
    this.context = context;
    this.rowItems = rowItems;
}

@Override
public int getCount() {
    return rowItems.size();
}

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

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

/* private view holder class */
private class ViewHolder {
    TextView member_name;

    TextView contactType;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_code, null);
        holder = new ViewHolder();

        holder.member_name = (TextView) convertView
                .findViewById(R.id.member_name);
        holder.contactType = (TextView) convertView
                .findViewById(R.id.contact_type);

        RowCode row_pos = rowItems.get(position);



        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
        holder.member_name.setText(row_pos.getMember_name());
        holder.contactType.setText(row_pos.getContactType());
    return convertView;
}

}