2017-08-13 28 views
0

因此,我爲ListView中的每個項目聲明瞭一個按鈕,但它恰好會響應更多項目,然後只是單擊一個項目。例如,如果我按下第一個按鈕的按鈕,第9和第18項也會變化。這將是真棒,如果你能幫助我這一個:)在此先感謝ListView中按鈕上的OnClickListener更改多個項目

This is the CusomtListAdapter which fills the ListView 

    public class CustomListAdapter extends BaseAdapter { 

    private ArrayList<Task> tasks; 
    private LayoutInflater inflater = null; 
    private Application application; 

    public CustomListAdapter(Activity activity, Application application, 
          ArrayList<Task> tasks) { 
     this.application = application; 
     this.tasks = tasks; 
     inflater = (LayoutInflater) application.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public static class ViewHolder { 
     TextView lv_tv_description; 
     TextView lv_tv_period; 
     Button lv_bt_done; 
     TextView lv_gone_pk; 
     TextView lv_gone_group_pk; 
     TextView lv_gone_description; 
     TextView lv_gone_period; 
     TextView lv_gone_period_kind; 
     TextView lv_gone_time; 
     TextView lv_gone_done; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View vi, ViewGroup parent) { 

     final ViewHolder viewHolder; 

     if (vi == null) { 
      vi = inflater.inflate(R.layout.listview, parent, false); 
      viewHolder = new ViewHolder(); 

      viewHolder.lv_tv_description = (TextView) vi.findViewById(R.id.lv_tv_description); 
      viewHolder.lv_tv_period = (TextView) vi.findViewById(R.id.lv_tv_period); 
      viewHolder.lv_bt_done = (Button) vi.findViewById(R.id.lv_bt_done); 

      viewHolder.lv_gone_pk = (TextView) vi.findViewById(R.id.lv_gone_pk); 
      viewHolder.lv_gone_group_pk = (TextView) vi.findViewById(R.id.lv_gone_group_pk); 
      viewHolder.lv_gone_description = (TextView) vi.findViewById(R.id.lv_gone_description); 
      viewHolder.lv_gone_period = (TextView) vi.findViewById(R.id.lv_gone_period); 
      viewHolder.lv_gone_period_kind = (TextView) vi.findViewById(R.id.lv_gone_period_kind); 
      viewHolder.lv_gone_time = (TextView) vi.findViewById(R.id.lv_gone_time); 
      viewHolder.lv_gone_done = (TextView) vi.findViewById(R.id.lv_gone_done); 


      vi.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) vi.getTag(); 
     } 

     viewHolder.lv_tv_description.setText(tasks.get(position).getDescription()); 
     viewHolder.lv_tv_period.setText(tasks.get(position).getPeriod_kind()); 

     viewHolder.lv_bt_done.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DatabaseHandler dbhandler = new DatabaseHandler(application); 


       View pk_view = (View) v.getParent().getParent().getParent(); 
       TextView textview_pk = ((TextView) pk_view.findViewById(R.id.lv_gone_pk)); 

       View parentView = (View) v.getParent().getParent(); 
       TextView textview1 = ((TextView) parentView.findViewById(R.id.lv_tv_description)); 
       TextView textview2 = ((TextView) parentView.findViewById(R.id.lv_tv_period)); 
       Button button = ((Button) parentView.findViewById(R.id.lv_bt_done)); 

       if (viewHolder.lv_bt_done.getText().toString().equalsIgnoreCase("done")) { 
        viewHolder.lv_tv_description.setPaintFlags(viewHolder.lv_tv_description.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
        viewHolder.lv_gone_description.setPaintFlags(viewHolder.lv_gone_description.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
        viewHolder.lv_bt_done.setText("UNDO"); 
        viewHolder.lv_bt_done.setBackgroundResource(R.drawable.layout_rounded_background_accent); 

        notifyDataSetChanged(); 

        dbhandler.updateDone(Integer.valueOf(textview_pk.getText().toString()), "true"); 
       } else if (viewHolder.lv_bt_done.getText().toString().equalsIgnoreCase("undo")) { 
        viewHolder.lv_tv_description.setPaintFlags(viewHolder.lv_tv_description.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
        viewHolder.lv_gone_description.setPaintFlags(viewHolder.lv_gone_description.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
        viewHolder.lv_bt_done.setText("DONE"); 
        viewHolder.lv_bt_done.setBackgroundResource(R.drawable.layout_rounded_background); 

        notifyDataSetChanged(); 

        dbhandler.updateDone(Integer.valueOf(textview_pk.getText().toString()), "false"); 
       } 

       dbhandler.close(); 
      } 
     }); 

     viewHolder.lv_gone_pk.setText(String.valueOf(tasks.get(position).getPk())); 

     if (tasks.get(position).getDone().equalsIgnoreCase("true")) { 
      viewHolder.lv_tv_description.setPaintFlags(viewHolder.lv_tv_description.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      viewHolder.lv_tv_period.setPaintFlags(viewHolder.lv_tv_description.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      viewHolder.lv_bt_done.setText("UNDO"); 
      viewHolder.lv_bt_done.setBackgroundResource(R.drawable.layout_rounded_background_accent); 
     } 

     return vi; 
    }} 

,這是所有項目

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:focusable="false" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="70dp"> 

    <LinearLayout 
     android:focusable="false" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:focusable="false" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1"> 

      <RelativeLayout 
       android:focusable="false" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_weight="1"> 

       <TextView 
        android:focusable="false" 
        android:id="@+id/lv_tv_description" 
        android:textSize="20dp" 
        android:textColor="@android:color/black" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentTop="true" 
        android:layout_marginTop="7dp"/> 

      </RelativeLayout> 

      <RelativeLayout 
       android:focusable="false" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_weight="2"> 

       <TextView 
        android:focusable="false" 
        android:id="@+id/lv_tv_period" 
        android:textColor="@android:color/black" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true"/> 

      </RelativeLayout> 

     </LinearLayout> 

     <RelativeLayout 
      android:focusable="false" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="4"> 

      <Button 
       android:id="@+id/lv_bt_done" 
       android:text="DONE" 
       android:focusable="false" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_alignParentTop="true" 
       android:layout_marginTop="10dp" 
       android:background="@drawable/layout_rounded_background"/> 

     </RelativeLayout> 

    </LinearLayout> 

    <!-- invisible TextViews --> 
    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_pk" 
     android:visibility="visible" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_group_pk" 
     android:visibility="visible" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_description" 
     android:visibility="gone" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_period" 
     android:visibility="gone" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_period_kind" 
     android:visibility="gone" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_time" 
     android:visibility="gone" 
     android:layout_alignParentRight="true"/> 

    <TextView 
     android:focusable="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_gone_done" 
     android:visibility="gone" 
     android:layout_alignParentRight="true"/> 

</RelativeLayout> 

,如果你有什麼事請讓我匹配的佈局文件在評論中知道:)

回答

1

View通過getView()方法的第二個參數(convertView)在ListView中得到重用。

從文檔,

convertView - 老視圖如果可能的話再利用。注意:您應該在 使用前檢查此視圖是否爲非空以及適當類型。如果無法將此視圖轉換爲顯示 正確的數據,則此方法可以創建新視圖。

因此,在任何時候,只有設備屏幕上可見的視圖數量(加上一些更多)在內存中可用。在您滾動列表時,屏幕上顯示的視圖將重用於正在進入屏幕的項目。

在你的情況,第1,第9和第18項與View重複使用相同。這就是爲什麼當您僅按第1項上的按鈕時,第9和第18項的變更View

解決方案:

當按下按鈕時,添加在一些數據結構,它的狀態信息。例如,在booleansarray中,對於其按鈕處於按下狀態的項目保存爲true,對於其他按鈕則保存爲false。

並在getView()方法中,檢查該布爾值數組中按鈕的狀態並分別更改視圖。

+0

我試過了,但我沒有工作......也許我沒有你沒有權利你能給我一個代碼示例嗎? :) – user3455536

+0

這對我也有很大幫助https://stackoverflow.com/questions/35538​​353/onclick-event-repeats-with-listview-items – user3455536

相關問題