我正在开设一个考勤应用。该应用的app:headerLayout="@layout/nav_header_main"
由学生列表组成。我想将颜色改为红色和绿色,表示缺席和呈现。问题是如果我有很多学生而不是屏幕。当前视图向下或向上的项目会丢失颜色。我的方法是否正确?如何保存每个列表项的颜色。当然,如果除了使用ListActivity
之外还有另一个最好的approch,我愿意接受建议。
这是包含列表
的ListActivityListView
我正在使用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
ListView的CustomAdapter类
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;
}
}
});
我已经仔细检查过它是一个独特的问题!休息保证...
提前感谢
答案 0 :(得分:1)
创建监听器接口:
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类:
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();
}
}