每当我滚动我不想要的ListView重新加载它的项目

时间:2017-02-20 14:59:43

标签: android listview

我在android中创建了一个列表视图,我想做的事情就像每次点击列表项时一样,它必须在红色和绿色之间切换颜色。我能够实现这一点,但问题是每次我向上或向下滚动列表视图时,它会一次又一次地重新加载列表项,并且切换的颜色正在丢失。

我尝试使用切换按钮而不是仅手动调整颜色,但即使这样也会失去其状态。当用户点击它时,它会变为开启状态,当用户向上或向下滚动时,它会失去状态并显示状态。

这是我的MainActivity.java文件

package bk.acs;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ListView listView;
        final String chars[] = new String[20];
        final int arr[]=new int[20];
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for(int i=0;i<20;i++)
        {
            chars[i]="15BEC058"+i;
        }
        Arrays.fill(arr,1);
        listView=(ListView)findViewById(R.id.row);
        MyAdapter adapter =new MyAdapter(this,chars);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                arr[i]=(arr[i]==0)?(1):(0);
             String res=(arr[i]==0)?("Absent"):("Present");
                if(arr[i]==0)
                {
                    view.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.setBackgroundColor(getResources().getColor(R.color.item_red));
                        }
                    });
                }
                if(arr[i]==1)
                {
                    view.setBackgroundColor(getResources().getColor(R.color.item_green));
                }
                Toast.makeText(MainActivity.this, "Marked "+chars[i]+" as "+res, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这是我的适配器:

class MyAdapter extends ArrayAdapter
{
    View row;
    TextView tv;
    String titles[];
    public MyAdapter(Context context , String[] titles )
    {
        super(context,R.layout.reg_li,R.id.reg_no,titles);
        this.titles=titles;
    }
    @NonNull
    @Override
    public View getView(int position , View controlView , ViewGroup parent)
    {
        LayoutInflater inflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row=inflater.inflate(R.layout.reg_li,parent,false);
        tv=(TextView)row.findViewById(R.id.reg_no);
        tv.setText(titles[position]);
        return row;
    }
}

2 个答案:

答案 0 :(得分:0)

要做到这一点,你需要声明一个默认设置为false的布尔变量。当您单击任何特定项目时,获取项目的位置,并将布尔变量的值设置为true,它将帮助您获得结果。

答案 1 :(得分:0)

仅在适配器类上使用Viewholder for listview android set colors

    public class MyAdapter extends BaseAdapter{
       String [] result;
    Context context;
       int [] imageId;
    private static LayoutInflater inflater=null;

 public Myadapter(MainActivity mainActivity, String[] prgmNameList, int[] prgmImages) {
  // TODO Auto-generated constructor stub
   result=prgmNameList;
    context=mainActivity;
   imageId=prgmImages;
   inflater = ( LayoutInflater )context.
 getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }

     @Override
     public int getCount() {
      // TODO Auto-generated method stub
          return result.length;
      }

      @Override
        public Object getItem(int position) {
   // TODO Auto-generated method stub
    return position;
      }

   @Override
   public long getItemId(int position) {
   // TODO Auto-generated method stub
   return position;
    }

 public class Holder
    {
 TextView tv_language;
   ImageView im_language;
    }
   @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
   // TODO Auto-generated method stub
   Holder holder=new Holder();
      View view;
      view = inflater.inflate(R.layout.layout_language_list_item, null);

   holder.tv_language=(TextView) view.findViewById(R.id.tv_language);
    holder.im_language=(ImageView) view.findViewById(R.id.image);

      holder.tv_language.setText(result[position]);
  Picasso.with(context).load(imageId[position]).into(holder.image);

    view.setOnClickListener(new OnClickListener() {
      @Override
     public void onClick(View v) {
       // TODO Auto-generated method stub
   //your color change if loop should come here

}
 });
   return view;
   }

  }

上面的适配器用于列表视图,包含一个imageview和一个textview。你需要在onclick监听器中提供你的换色代码。我在评论中提到了这个地方。请参阅Android Custom Listview以正确实施listview