【问题标题】:Android Listview is not providing me right positionAndroid Listview 没有为我提供正确的位置
【发布时间】:2016-10-24 15:44:02
【问题描述】:

我正在实现一个 android ListView,它有时有超过 1000 条记录。

这就是我目前正在做的事情:

  • 我正在从数据库中获取记录。
  • 我的ListView 布局中有一个按钮。
  • 单击按钮时,我只是显示我的数据库表的主键,它设置为自动递增。

问题是:

假设我有 10 行,当我点击第一行的按钮时,它会返回第二行的值。当我点击第二个列表按钮时,它返回第三个值。如果我点击列表中的最后一个按钮,它会返回正确的值。

这是我的 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.ProductDetailResult;
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;

    }
}

感谢任何建议/帮助。我被困在我的项目中间。

提前致谢。

【问题讨论】:

  • 试试prod_id = position
  • 是不是因为你的dbstrat索引是从0开始的,而listView的索引是从1开始的,还是反了?
  • 我无法为 prod_id 分配位置,因为我的 prod_id 不按顺序排列,因为我在数据库中应用过滤,因此产品 ID 可以是所有 2000 条记录中的任何一个

标签: android listview android-adapter listadapter


【解决方案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()

在 ViewHolder 类中声明的“prod_id”。它包裹得很好。

【讨论】:

  • 但是我想知道为什么我们需要设置标签而不是直接访问?
  • @Bilal 您应该将此答案标记为正确答案,因为它可以帮助您解决问题。
  • prod_id 是全局变量,您也没有将此值设置为行。那么如何从行或行项目中获取正确的值。所以我们应该将值设置为行,然后我们才能得到正确的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多