Android 滚动时列表视图混乱
我知道这个问题在stackoverflow上有很多答案,我也找到了很多答案。但是,我没有找到任何解决我问题的办法 我的问题是: 我正在为一家初创公司制作考勤系统。应用程序中的第二个活动,从sql server获取员工数据并将其显示在列表中。我的列表项有一个文本视图和一个按钮。按钮显示员工的状态。现在,当我点击按钮时,按钮的状态变化存在双重性。假设我对一个项目执行此操作,则在滚动列表中的另一个项目时会执行此操作 我尝试的是: 研究了自定义适配器的概念以及在适配器类中重写get视图。 研究了列表视图中的回收概念和持有者概念 仍然无法解决。请提出一些建议 以下是适配器类中的代码:Android 滚动时列表视图混乱,android,android-layout,android-listview,Android,Android Layout,Android Listview,我知道这个问题在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的元素进行比较,以便获得正确的条目。因此,这就是我为删除错误所做的
**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"
/>