2015-10-05 56 views
0

我想顯示數據庫中的信息到我的列表視圖。我可以顯示它,但是當我想要使用它時,我在getView方法中獲得了不準確的位置。你們可以給我一些我應該怎麼做的提示嗎?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

這行創建問題,我想...'productsList = dbhandler.getFavList(); listview.setAdapter(new ViewAdapter());'。只需在列表視圖中獲取值並在適配器上調用notifydatasetchanged()即可。沒有必要一次又一次地設置適配器.. –

+0

你的問題很可能是類似[此問題的ListView(http://stackoverflow.com/questions/32930800/edit-text-loses-content-in-list-view-上滾動/ 32931806) –

+0

@oberflansch我不力使用視圖持有者 –

回答

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; 
} 


} 
+0

爲什麼你不使用視圖? –

+0

@aayushi仍然無法工作,但我非常感謝你的幫助 –

+0

@anand導致我的項目只是三個項目 –

0

BaseAdapter有一些方法需要被重寫。其中有getCount()

在創建和諸如此類的東西ListView控件,它調用getCount()。如果這返回一個不等於0的值(我返回了之前在構造函數中初始化的ArrayList的大小),那麼它會調用getView()足夠多次來填充屏幕上的項目。例如,我用20個項目初始化ArrayList。因爲只有8個項目開始適應屏幕上,getView()被稱爲8次,每次要求它要求我回(更精確的位置也想知道行會是什麼樣子在名單上的具體位置,是什麼它需要包含的數據)。如果我向下滾動列表,getView()會被一遍又一遍地調用,直到我打到列表的末尾,在我的例子中是20個項目/行。

notifyDataSetChanged()所做的是...當被調用時,它會查看屏幕上顯示的內容(更確切地說是哪些行索引),並調用getView()與這些位置。

也就是說,如果你在列表中顯示第8項(所以這些是那些在屏幕上可見),你在列表中添加了第二和第三項之間的另一個項目,你叫notifyDataSetChanged()然後getView()被稱爲8次,位置從0開始到7結束,並且因爲在getView()方法中你從ArrayList獲取數據,它會自動返回列表中插入的新項目以及前8(7而不是8,因爲最後一個項目向下一個位置,所以它不再可見),ListView將重繪或任何與這些項目。 複製here

您可以嘗試編輯的代碼。

public class ViewAdapter extends BaseAdapter { 
    LayoutInflater minflater; 


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

    @Override 
    public Object getItem(int position) { 
     return productsList.get(position); 
    } 

    @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.clear(); 
       productsList.addAll(dbhandler.getFavList()); 
       ((ViewAdapter)listview.getAdapter()).notifyDataSetChanged(); 


      } 


     }); 


     return convertView; 
    } 
} 
+0

listview.getAdapter()。notifyDataSetChanged();不能過程,它有錯誤。有限的不是我糾正它的類型。難道我不得不在ui上運行嗎? –

+1

確定嘗試使用..'((ViewAdapter)listview.getAdapter())。notifyDataSetChanged();' –

+0

整個事情變得遲緩並且什麼都不做,它會在一段時間後崩潰 –