getView位置不准确

时间:2015-10-05 08:14:53

标签: android view

我正在尝试将数据库中的信息显示到列表视图中。我可以显示它,但是当我想用它做某事时,我在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;
    }
}

2 个答案:

答案 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()