#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 является глобальной переменной, и вы также не устанавливаете это значение в строку. Итак, как вы можете получить правильное значение из строки или элементов строки. Поэтому мы должны установить значение в строку, только тогда мы получим правильное значение.