我正在尝试将数据库中的信息显示到列表视图中。我可以显示它,但是当我想用它做某事时,我在getView方法中得到的位置不准确。你能给我一些关于我该怎么办的提示吗?
public class ViewAdapter extends BaseAdapter {
LayoutInflater minflater;
@Override
public int getCount() {
return productsList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
public ViewAdapter() {
minflater = LayoutInflater.from(getBaseContext());
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = minflater.inflate(R.layout.you, null);
}
final TextView text11 = (TextView) convertView.findViewById(R.id.text11);
text11.setText(productsList.get(position).get_productname());
final TextView text22 = (TextView) convertView.findViewById(R.id.text22);
text22.setText(productsList.get(position).get_versionname());
final TextView text33 = (TextView) convertView.findViewById(R.id.text33);
text33.setText(productsList.get(position).get_date());
final Button update = (Button) convertView.findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// int a = dbhandler.checkDatabase(productsList.get(position).get_date());
final Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
StringBuffer buffer = new StringBuffer();
buffer.append(day + "-" + (month + 1) + "-" + year);
String date = DateFormat.getTimeInstance().format(new Date());
String b = "Date: " + buffer + "\n" + "Time: " + "" + date + "\n";
dbhandler = new mydbhandler(getBaseContext(), null,null,1);
dbhandler.updateProduct(position,b);
productsList = dbhandler.getFavList();
listview.setAdapter(new ViewAdapter());
}
});
return convertView;
}
}
答案 0 :(得分:2)
更改了您可以尝试的代码,它对我很有用
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;
public class ViewAdapter extends BaseAdapter
{
LayoutInflater minflater;
@Override
public int getCount() {
return productsList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public ViewAdapter() {
minflater = LayoutInflater.from(getBaseContext());
}
public class Holder
{
TextView text11 , text22 ,text33;
Button update;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
final Holder holder;
if (convertView == null)
{
convertView = minflater.inflate(R.layout.you, null);
holder=new Holder();
holder.text11 = (TextView) convertView.findViewById(R.id.text11);
holder.text22 = (TextView) convertView.findViewById(R.id.text22);
holder.text33 = (TextView) convertView.findViewById(R.id.text33);
holder.update = (Button) convertView.findViewById(R.id.update);
convertView.setTag(holder);
}
else
{
holder = (Holder) convertView.getTag();
}
holder.text11.setText(productsList.get(position).get_productname());
holder.text22.setText(productsList.get(position).get_versionname());
holder.text33.setText(productsList.get(position).get_date());
return convertView;
}
}
答案 1 :(得分:0)
在class ProfilesController < ApplicationController
before_action :authenticate_user!
before_action :only_current_user
def new
# form where a user can fill out their OWN profile
@user = User.friendly.find( params[:user_id] )
@profile = Profile.new
end
def create
@user = User.friendly.find( params[:user_id] )
@profile = @user.build_profile(profile_params)
if @profile.save # Not saving!!
flash[:success] = 'Profile Created!'
redirect_to user_path( params[:user_id] )
else
render action: :new # keeps rendering!
end
end
private
def profile_params
params.require(:profile).permit(:first_name, :last_name, :avatar, :job_title, :phone_number, :business_name)
end
end
中,有一些方法需要被覆盖。其中,有BaseAdapter
。
创建ListView后,它会调用getCount()
。如果这返回一个不同于0的值(我返回了我之前在构造函数中初始化的ArrayList的大小),那么它会调用getCount()
足够的次数来填充屏幕上的项目。例如,我用20个项初始化了ArrayList。因为最初只有8个项目适合屏幕,getView()
被调用了8次,每次都要求我返回所需的位置(更确切地说,它想知道该行在列表中的行为如何具体位置,需要包含哪些数据)。如果我向下滚动列表,getView()会一遍又一遍地调用,直到我点击列表的末尾,在我的情况下是20个项目/行。
getView()
做的是......当被调用时,它会查看屏幕在调用时显示的内容(更准确地说是哪些行索引)并使用这些位置调用notifyDataSetChanged()
即。如果你显示列表中的前8个项目(那些是屏幕上可见的项目),你在列表中的第2个和第3个项目之间添加另一个项目,然后调用getView()
然后{{ 1}}被调用8次,位置从0开始到7结束,因为在getView()方法中你从ArrayList获取数据然后它将自动返回插入列表中的新项目7在前8个中(7而不是8,因为最后一个项目向下移动了一个位置,因此它不再可见),ListView将使用这些项重绘或其他任何内容。
从 here
您可以尝试使用已编辑的代码。
notifyDataSetChanged()