簡體   English   中英

列表視圖在滾動時弄亂了

[英]List view messing up on scrolling

我知道有很多關於stackoverflow的問題的答案,而且我的確做了很多。 但是,我並沒有為我的問題找到任何解決方案。

我的問題:

我正在為一家初創公司准備考勤系統。 應用中的第二項活動,從sql server中獲取員工數據並將其顯示在列表中。 我的列表項有一個文本視圖和一個按鈕。 按鈕顯示員工的狀態。 現在,當我單擊按鈕時,按鈕的狀態更改存在重復。 假設我為1個項目執行此操作,然后在滾動時針對列表中的另一個項目進行操作。

我試過的

研究了自定義適配器的概念並覆蓋了適配器類中的get視圖。 研究了列表視圖和持有者概念中的回收概念。

仍然無法解決。 請提出一些建議。

這是適配器類的代碼:

package mywork.attendance_system;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Harshul on 8/24/2015.
 */
public class custom_adapter extends ArrayAdapter<String> {

    private LayoutInflater inflater;
   // private int[] colors;
    ArrayList<String> emp;
    //ArrayList<Boolean> status;

    public custom_adapter(Activity activity , ArrayList<String> items)
        {
            super(activity, R.layout.rowlayout, items);
            inflater = activity.getWindow().getLayoutInflater();
            emp=items;
      //      this.status=status;
            Log.d("1111",emp.get(1));
           // this.colors[0]=Color.parseColor("#FFFFF");
           // this.colors[1]=Color.parseColor("#D2E4FC");
        }

    static class ViewHolder{
        public TextView tview;
        public Button b1;

    }
    @Override
    public View getView(int position, View convertView, final ViewGroup parent){
       ViewHolder viewHolder = null;
        if (convertView==null)
        {
        convertView = inflater.inflate(R.layout.rowlayout, null);
        viewHolder = new ViewHolder();
        viewHolder.tview=(TextView)convertView.findViewById(R.id.t1);
        viewHolder.b1=(Button)convertView.findViewById(R.id.A);
            convertView.setTag(viewHolder);
        }
else
        {
            viewHolder=(ViewHolder)convertView.getTag();
        }
        final ViewHolder finalViewHolder = viewHolder;
        viewHolder.b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                LinearLayout parentRow = (LinearLayout) v.getParent();
                ListView listView = (ListView) parentRow.getParent();
                final int position1 = listView.getPositionForView(parentRow);

                if((finalViewHolder.b1.getText()).equals("A")) {
                    finalViewHolder.b1.setText("P");
                    //            status.set(position1,true);
                    //          Log.d("statussss",String.valueOf(status.get(position1)));
                }
                else {
                    finalViewHolder.b1.setText("A");
                    //        status.set(position1,false);
                    //      Log.d("statussss",String.valueOf(status.get(position1)));
                }
            }});


        finalViewHolder.tview.setText(String.valueOf(emp.get(position)));

        if (position%2==1)
        {
            finalViewHolder.tview.setBackgroundColor(Color.parseColor("#F0F0F0"));
        }
        else
        {
            finalViewHolder.tview.setBackgroundColor(Color.parseColor("#D2E4FC"));
        }



            return convertView;

        }

    }

我的XML文件用於列表項的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">

    <TextView
        android:id="@+id/t1"
        android:layout_width="237dp"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:padding="20dp"
        android:textColor="#222222"
        android:textStyle="bold"
        />
    <Button
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:id="@+id/A"
        android:text="A"
        android:textSize="20dp"
        />

</LinearLayout>

如果您還有其他需要說的話,我會上傳。

我的屏幕看起來如何 duplicacy

所以,這就是我刪除錯誤的方法...

  1. 刪除了convertview == null條件。
  2. 將按鈕的狀態存儲在單獨的列表中,然后從列表中提取狀態。

     **ArrayList<String> status;** **public custom_adapter(Activity activity , ArrayList<String> items,ArrayList<String> statusc)** { super(activity, R.layout.rowlayout, items); inflater = activity.getWindow().getLayoutInflater(); emp=items; **status=statusc;** } static class ViewHolder{ public TextView tview; public Button b1; } @Override public View getView(final int position, View convertView, final ViewGroup parent){ ViewHolder viewHolder = null; convertView = inflater.inflate(R.layout.rowlayout, null); viewHolder = new ViewHolder(); viewHolder.tview=(TextView)convertView.findViewById(R.id.t1); viewHolder.b1=(Button)convertView.findViewById(R.id.A); **viewHolder.b1.setText(status.get(position));** convertView.setTag(viewHolder); final ViewHolder finalViewHolder = viewHolder; viewHolder.b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LinearLayout parentRow = (LinearLayout) v.getParent(); ListView listView = (ListView) parentRow.getParent(); final int position1 = listView.getPositionForView(parentRow); if((finalViewHolder.b1.getText()).equals("A")) { finalViewHolder.b1.setText("P"); **status.set(position,"P");** } else { finalViewHolder.b1.setText("A"); **status.set(position,"A");** } }}); finalViewHolder.tview.setText(String.valueOf(emp.get(position))); if (position%2==1) { finalViewHolder.tview.setBackgroundColor(Color.parseColor("#F0F0F0")); } else { finalViewHolder.tview.setBackgroundColor(Color.parseColor("#D2E4FC")); } return convertView; } } 

嘗試這個,

    @Override
    public void onClick(View v) {
        if((v.getText()).equals("A")) {
            v.setText("P");
        }
        else {
            v.setText("A");
        }
    }

您面臨的問題是因為您要從getView中獲取Position變量,該變量給您在任何給定時間在屏幕上呈現的元素的位置,而不是該元素在數據庫中的位置。

您可以做的是,除了索引以外,您還可以在db中擁有唯一元素,當您填充Ui時,可以將其添加為其中的一部分。 因此,當您獲得位置“ x”的元素時,您可以獲取條目並將唯一元素與數據庫的元素進行比較,以便獲得正確的條目。

對setOnClickListener使用最終的viewholder變量

在您的情況下使用:

finalviewHolder.b1.setOnClickListener(new View.OnClickListener() ...

代替

viewHolder.b1.setOnClickListener(new View.OnClickListener() ....

從您的textview中刪除硬代碼文本

<Button
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:id="@+id/A"
        android:text="A"// Remove this line
        android:textSize="20dp"
        />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM