【问题标题】:List view messing up on scrolling列表视图在滚动时搞砸了
【发布时间】:2015-08-26 14:28:39
【问题描述】:

我知道在 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>

如果你还需要什么就说吧,我会上传的。

【问题讨论】:

  • ArrayList emp;应该是 ArrayList emp;并且 Employe 有 name 和 isActive 字段,使用 isActive 作为按钮。你能不能试试。
  • @sedpol - 你可以给我一些例子或任何代码参考。我没明白。
  • @harshuljain 你有一个谷歌的例子。这是找到它的最佳地点。
  • @harshuljain 当我用谷歌搜索“带有按钮的 android 列表示例”时,我发现了这个 -> looksok.wordpress.com/tag/listview-item-with-button 这对你来说是一个很好的参考。

标签: android android-layout android-listview


【解决方案1】:

所以,这就是我为消除错误所做的...

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

【讨论】:

    【解决方案2】:

    试试这个,

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

    【讨论】:

      【解决方案3】:

      您面临的问题是因为您从 getView 获取 Position 变量,它为您提供在任何给定时间呈现在屏幕上的元素的位置,而不是该元素的位置在您的数据库中。

      您可以做的是除了索引之外,您可以在 db 中拥有唯一元素,当您填充 Ui 时,您可以将其添加为其中的一部分。 因此,当您确实获得 Position 'x' 的元素时,您可以获取该条目并将唯一元素与 db 的元素进行比较,以便获得正确的条目。

      【讨论】:

        【解决方案4】:

        为 setOnClickListener 使用最终的 viewholder 变量

        在你的情况下使用:

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

        而不是

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

        从您的文本视图中删除硬代码文本

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

        【讨论】:

          猜你喜欢
          • 2016-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-27
          相关资源
          最近更新 更多