如何切换和保存ListView项目颜色? [英] How to toggle ListView item colors and Save it?
问题描述
我正在开发出勤应用程序.该应用程序具有由学生列表组成的 ListActivity
.我想将颜色更改为红色和绿色,以指示缺少和存在.问题是如果我的学生比屏幕长.当前视图中向下或向上的项目会失去颜色.我的方法正确吗?如何保存每个列表项的颜色.当然,除了使用 ListView
之外,还有其他最好的选择,我愿意提出建议.
I'm working on an Attendance app. The app has ListActivity
consisting of a list of students. I want to change color to RED and GREEN indicating absent and present. The problem is if I have long list of students than screen. The items that are down or up the current view loses color. Is my approach correct? How can I save the color of each individual list item. Of course if there is another best approch other than using ListView
, I'm open to suggestions.
这是包含列表的ListActivity
Here is the ListActivity containing the list
public class ListActivity extends Activity implements Serializable{
private String userName;
private TextView nameTextView;
private ListView nameList;
private CustomAdapter adapter;
private boolean colorRed;
private Class myClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
myClass = new Class();
colorRed = false;
// Open the students list from file if exists
openFromFile();
nameList = (ListView) findViewById(R.id.nameListView);
nameTextView = (TextView) findViewById(R.id.nameTextView);
Bundle extras = getIntent().getExtras();
if (extras != null) {
userName = extras.getString("NAME");
nameTextView.setText("Hi! " + userName);
}
adapter = new CustomAdapter(this, myClass.getStudentNames());
nameList.setAdapter(adapter);
TextView tv = (TextView) findViewById(R.id.sNametv);
nameList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (colorRed == true) {
view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorPresent));
colorRed = false;
} else {
view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorAbsent));
colorRed = true;
}
// ALso could use this
// adapterView.getChildAt(position).setBackgroundColor(Color.RED);
}
});
}
我正在使用 boolean colorRed
检查颜色,因为我无法将视图颜色与 colors xml
中的颜色进行比较.
I'm using a boolean colorRed
for checking color as I'm not able to compare view color with color from colors xml
.
nameList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (colorRed == true) {
view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorPresent));
colorRed = false;
} else {
view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.colorAbsent));
colorRed = true;
}
}
});
ListView的CustomAdapter类
CustomAdapter Class for ListView
public class CustomAdapter extends ArrayAdapter<String> {
public CustomAdapter(Context context, ArrayList<String> names) {
super(context, R.layout.custom_layout, names);
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(getContext());
View customView = inflater.inflate(R.layout.custom_layout, parent, false);
String singleName = getItem(position);
TextView tv = (TextView) customView.findViewById(R.id.sNametv);
tv.setText(singleName);
return customView;
}
}
我已经仔细检查了这是一个独特的问题!放心...
I've double checked it's a unique question! Rest Assured...
先谢谢您
推荐答案
创建侦听器接口:
public interface ListListener {
void clickListItem(int position);
}
这是Model类:
public class Route {
String studentName;
boolean colorRed;
public Route(String studentName, boolean colorRed) {
this.studentName=studentName;
this.colorRed=colorRed;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public boolean isColorRed() {
return colorRed;
}
public void setColorRed(boolean colorRed) {
this.colorRed = colorRed;
}
}
创建适配器类:
public class AAdapter extends BaseAdapter implements View.OnClickListener {
Context context;
private List<Route> routes;
Holder holder;
private static LayoutInflater inflater=null;
ListListener listListener;
public AAdapter(Context context, List<Route> names,ListListener listListener) {
this.routes=names;
this.context=context;
this.listListener=listListener;
inflater = ( LayoutInflater )context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public void onClick(View view) {
listListener.clickListItem((Integer)view.getTag());
}
private class Holder
{
TextView tv;
}
@Override
public Route getItem(int position) {
return routes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
return routes.size();
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null){
holder=new Holder();
convertView=inflater.inflate(R.layout.custom_layout,null);
holder.tv=(TextView)convertView.findViewById(R.id.textView);
holder.tv.setOnClickListener(this);
convertView.setTag(holder);
}else {
holder=(Holder)convertView.getTag();
}
holder.tv.setText(routes.get(position).getStudentName());
holder.tv.setTag(position);
if (!routes.get(position).colorRed){
holder.tv.setBackgroundColor(Color.GREEN);
}else {
holder.tv.setBackgroundColor(Color.RED);
}
return convertView;
}
}
现在的MainActivity类:
Now MainActivity Class:
public class MainActivity extends AppCompatActivity implements ListListener{
AAdapter adapter;
ListView lv;
List<Route> myNames;
ListListener listListener=MainActivity.this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.listnames);
myNames=new ArrayList<>();
/* DEMO DATA U NEED TO FETCH YOUR DATA */
myNames.add(new Route("FIRST",false));
myNames.add(new Route("Second",false));
myNames.add(new Route("Third",false));
myNames.add(new Route("Fourth",false));
myNames.add(new Route("Fifth",false));
myNames.add(new Route("FIRST",false));
myNames.add(new Route("Second",false));
myNames.add(new Route("Third",false));
myNames.add(new Route("Fourth",false));
myNames.add(new Route("Fifth",false));
myNames.add(new Route("FIRST",false));
myNames.add(new Route("Second",false));
myNames.add(new Route("Third",false));
myNames.add(new Route("Fourth",false));
myNames.add(new Route("Fifth",false));
myNames.add(new Route("FIRST",false));
myNames.add(new Route("Second",false));
myNames.add(new Route("Third",false));
myNames.add(new Route("Fourth",false));
myNames.add(new Route("Fifth",false));
adapter = new AAdapter(this, myNames,listListener);
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void clickListItem(int position) {
if(myNames.get(position).colorRed){
myNames.get(position).colorRed=false;
}else {
myNames.get(position).colorRed=true;
}
adapter.notifyDataSetChanged();
}
}
这篇关于如何切换和保存ListView项目颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!