Android Listview не предоставляет мне правильную позицию

#android #listview #android-adapter #listadapter

#Android #listview #android-адаптер #listadapter

Вопрос:

Я внедряю Android ListView , который иногда содержит более 1000 записей.

Это то, что я сейчас делаю:

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

Проблема в том:

Допустим, у меня есть 10 строк, когда я нажимаю на кнопку в первой строке, она возвращает значение второй строки. И когда я нажимаю на вторую кнопку списка, она возвращает 3-е значение. И если я нажму на последнюю кнопку в списке, она вернет правильное значение.

Вот мой код адаптера listview:

 import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

import info.androidhive.navigationdrawer.R;
import info.androidhive.navigationdrawer.activity.ProductDetailResu<
import info.androidhive.navigationdrawer.other.SharedPreference;
import info.androidhive.navigationdrawer.singloton_classes.ProductResultSingloton;



public class ProductResultListAdaptor extends BaseAdapter {
    private Activity activity;
    Typeface custom_font;
    String mDrawableName;
    private LayoutInflater inflater;

    private List<ProductResultSingloton> result_items;
    int prod_id;

    public ProductResultListAdaptor(Activity activity, List<ProductResultSingloton> result_items) {
        this.activity = activity;
        this.result_items = result_items;
    }

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

    @Override
    public Object getItem(int location) {
        return result_items.get(location);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Viewholder holder;
        if (inflater == null) {
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.products_list, null);
            holder = new Viewholder();

            holder.modal        = (TextView) convertView.findViewById(R.id.prod_result_modal);
            holder.type         = (TextView) convertView.findViewById(R.id.prod_result_type);
            holder.observation  = (TextView) convertView.findViewById(R.id.prod_result_obeservation);
            holder.view_detail  = (Button) convertView.findViewById(R.id.show_detail);
            holder.view_detail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(activity,Integer.toString(prod_id),Toast.LENGTH_LONG).show();
                }
            });
            convertView.setTag(holder);

        }else {

            holder = (Viewholder) convertView.getTag();
        }
        ProductResultSingloton m = result_items.get(position);

        prod_id = m.getRow_id(); //Database id is set to singlton class.
        holder.modal.setText(m.getCODIGO());
        holder.type.setText(m.getTIPO());
        holder.observation.setText(m.getOBSERVACIONES());

        return convertView;
    }

    static  class Viewholder{
        TextView modal;
        TextView type;
        TextView observation;

        Button  view_detail;

    }
}
  

Приветствуются любые предложения / помощь. Я застрял в середине своего проекта.

Заранее спасибо.

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

1. Попробуйте prod_id = position

2. Это потому, что ваш индекс в db strat начинается с 0, а индекс ListView начинается с 1 или наоборот?

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

Ответ №1:

Лучший способ — просто установить тег для кнопки.

 holder.view_detail.setTag(m.getRow_id());

//and when button is clicked then fetch the ID of the row from button
holder.view_detail.getTag()
  

или

«prod_id», объявленный в классе ViewHolder. Он переносится должным образом.

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

1. Но я хочу знать, почему нам нужно установить тег вместо прямого доступа?

2. @Bilal Вы должны отметить этот ответ как правильный, поскольку он помог вам решить вашу проблему.

3. prod_id является глобальной переменной, и вы также не устанавливаете это значение в строку. Итак, как вы можете получить правильное значение из строки или элементов строки. Поэтому мы должны установить значение в строку, только тогда мы получим правильное значение.