Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动时列表视图混乱_Android_Android Layout_Android Listview - Fatal编程技术网

Android 滚动时列表视图混乱

Android 滚动时列表视图混乱,android,android-layout,android-listview,Android,Android Layout,Android Listview,我知道这个问题在stackoverflow上有很多答案,我也找到了很多答案。但是,我没有找到任何解决我问题的办法 我的问题是: 我正在为一家初创公司制作考勤系统。应用程序中的第二个活动,从sql server获取员工数据并将其显示在列表中。我的列表项有一个文本视图和一个按钮。按钮显示员工的状态。现在,当我点击按钮时,按钮的状态变化存在双重性。假设我对一个项目执行此操作,则在滚动列表中的另一个项目时会执行此操作 我尝试的是: 研究了自定义适配器的概念以及在适配器类中重写get视图。 研究了列表视图

我知道这个问题在stackoverflow上有很多答案,我也找到了很多答案。但是,我没有找到任何解决我问题的办法

我的问题是:

我正在为一家初创公司制作考勤系统。应用程序中的第二个活动,从sql server获取员工数据并将其显示在列表中。我的列表项有一个文本视图和一个按钮。按钮显示员工的状态。现在,当我点击按钮时,按钮的状态变化存在双重性。假设我对一个项目执行此操作,则在滚动列表中的另一个项目时会执行此操作

我尝试的是:

研究了自定义适配器的概念以及在适配器类中重写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;

        }

    }
打包mywork.Attention\u系统;
导入android.app.Activity;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.graphics.Color;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.LinearLayout;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.ArrayList;
导入java.util.List;
/**
*由Harshul于2015年8月24日创建。
*/
公共类自定义_适配器扩展ArrayAdapter{
私人充气机;
//私有int[]颜色;
ArrayList emp;
//阵列列表状态;
公共自定义_适配器(活动、ArrayList项)
{
超级(活动、R.layout.rowlayout、项目);
充气器=活动。getWindow().GetLayoutFlater();
emp=项目;
//这个状态=状态;
日志d(“1111”,emp.get(1));
//this.colors[0]=Color.parseColor(“#FFFFF”);
//this.colors[1]=Color.parseColor(“#D2E4FC”);
}
静态类视窗夹{
公共文本视图tview;
公共按钮b1;
}
@凌驾
公共视图getView(int位置、视图转换视图、最终视图组父视图){
ViewHolder ViewHolder=null;
if(convertView==null)
{
convertView=充气机。充气(R.layout.rowlayout,null);
viewHolder=新的viewHolder();
viewHolder.tview=(TextView)convertView.findViewById(R.id.t1);
viewHolder.b1=(按钮)convertView.findViewById(R.id.A);
convertView.setTag(viewHolder);
}
其他的
{
viewHolder=(viewHolder)convertView.getTag();
}
最终视图持有者finalViewHolder=视图持有者;
viewHolder.b1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
LinearLayout parentRow=(LinearLayout)v.getParent();
ListView ListView=(ListView)parentRow.getParent();
final int position1=listView.getPositionForView(父行);
if((finalViewHolder.b1.getText()).equals(“A”)){
finalViewHolder.b1.setText(“P”);
//状态设置(位置1,真);
//Log.d(“statussss”,String.valueOf(status.get(position1));
}
否则{
finalViewHolder.b1.setText(“A”);
//状态设置(位置1,错误);
//Log.d(“statussss”,String.valueOf(status.get(position1));
}
}});
finalViewHolder.tview.setText(String.valueOf(emp.get(position));
如果(位置%2==1)
{
finalView.tview.setBackgroundColor(Color.parseColor(“#f0”);
}
其他的
{
finalView.tview.setBackgroundColor(Color.parseColor(“#D2E4FC”);
}
返回视图;
}
}
列表项布局的我的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>

如果你还需要什么,尽管说,我会上传的

试试这个

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

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

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

因此,这就是我为删除错误所做的

  • 已删除convertview==null条件
  • 将按钮的状态存储在单独的列表中,并从列表中提取状态

    **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;
    
        }
    
    }
    
    **ArrayList状态**
    **公共自定义_适配器(活动活动、ArrayList项、ArrayList状态C)**
    {
    超级(活动、R.layout.rowlayout、项目);
    充气器=活动。getWindow().GetLayoutFlater();
    emp=项目;
    **状态=状态C**
    }
    静态类视窗夹{
    公共文本视图tview;
    公共按钮b1;
    }
    @凌驾
    公共视图getView(最终整型位置、视图转换视图、最终视图组父视图){
    ViewHolder ViewHolder=null;
    convertView=充气机。充气(R.layout.rowlayout,null);
    viewHolder=新的viewHolder();
    viewHolder.tview=(TextView)convertView.findViewById(R.id.t1);
    viewHolder.b1=(按钮)convertView.findViewById(R.id.A);
    **viewHolder.b1.setText(status.get(position))**
    convertView.setTag(viewHolder);
    最终视图持有者finalViewHolder=视图持有者;
    viewHolder.b1.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(视图v){
    LinearLayout parentRow=(LinearLayout)v.getParent();
    ListV
    
    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"
            />