在 TableLayout 中按行对表进行排序?
Sorting tables row-wise in a TableLayout?
我正在使用 TableLayout 在 Android 中显示 table。我想在单击按钮时对 table 进行排序。这就是我尝试过的。但它对每一列进行排序。我想要的是根据列对行进行排序?
private View.OnClickListener msg = new View.OnClickListener() {
public void onClick(View v) {
ArrayList < String > sortobj = new ArrayList < String > ();
ArrayList < String > sortobj1 = new ArrayList < String > ();
ArrayList < String > sortobj2 = new ArrayList < String > ();
ArrayList < String > sortobj3 = new ArrayList < String > ();
for (int i = 0; i <= listobj.size(); i++) {
sortobj.add(listobj.get(i).get(TAG_Name));
sortobj1.add(listobj.get(i).get(TAG_Abbr));
sortobj2.add(listobj.get(i).get(TAG_Area));
sortobj3.add(listobj.get(i).get(TAG_Capital));
if (listobj.get(i).get(TAG_Name).equals("West Bengal"))
break;
}
Collections.sort(sortobj, Collections.reverseOrder());
Collections.sort(sortobj1, Collections.reverseOrder());
Collections.sort(sortobj2, Collections.reverseOrder());
Collections.sort(sortobj3, Collections.reverseOrder());
table = (TableLayout) findViewById(R.id.mytable);
Log.e(TAG, "Sorted in reverse order................ :");
for (int i = 0; i < sortobj.size(); i++) {
TableRow row = new TableRow(getApplicationContext());
TextView tv0 = new TextView(getApplicationContext());
TextView tv1 = new TextView(getApplicationContext());
TextView tv2 = new TextView(getApplicationContext());
TextView tv3 = new TextView(getApplicationContext());
row.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.WRAP_CONTENT,
TableRow.LayoutParams.MATCH_PARENT));
tv0.setText(sortobj.get(i));
tv1.setText(sortobj1.get(i));
tv2.setText(sortobj2.get(i));
tv3.setText(sortobj3.get(i));
row.addView(tv0);
row.addView(tv1);
row.addView(tv2);
row.addView(tv3);
table.addView(row, new TableLayout.LayoutParams(
TableLayout.LayoutParams.WRAP_CONTENT,
TableLayout.LayoutParams.MATCH_PARENT));
}
}
};
问题一:
正在对每列进行排序
解法:
对行而不是单元格进行排序。
包括这个 class 并像这样创建 ArrayList List < Row > rows= new ArrayList < Row > ();
class Row implements Comparable<Row>{
String Abb;
String Area;
String Capital;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
String Name;
public String getAbb() {
return Abb;
}
public void setAbb(String abb) {
Abb = abb;
}
public String getArea() {
return Area;
}
public void setArea(String area) {
Area = area;
}
public String getCapital() {
return Capital;
}
public void setCapital(String capital) {
Capital = capital;
}
@Override
public int compareTo(@NonNull Row o) {
return this.Name.compareTo(o.Name);
}
}
现在您可以通过这种方式访问每一列:String Name = rows.get(index).getName();
rows.get(index).setName("Kerala");
然后进行排序,简单的把rows.sort();
问题二:
行附加到现有 table
解法:
在添加已排序的行之前,在循环中使用 removeView() 删除所有行
很好地解释了问题的第一部分
对于第二部分,您应该使用 removeAllViews()
而不是在循环中使用 removeView()
。如果您的 table 包含与上一个问题中解释的 Row
class 或类似 class 无关的 headers,您可以使用单独的函数来膨胀将行添加回 table.
之前的 headers
我正在使用 TableLayout 在 Android 中显示 table。我想在单击按钮时对 table 进行排序。这就是我尝试过的。但它对每一列进行排序。我想要的是根据列对行进行排序?
private View.OnClickListener msg = new View.OnClickListener() {
public void onClick(View v) {
ArrayList < String > sortobj = new ArrayList < String > ();
ArrayList < String > sortobj1 = new ArrayList < String > ();
ArrayList < String > sortobj2 = new ArrayList < String > ();
ArrayList < String > sortobj3 = new ArrayList < String > ();
for (int i = 0; i <= listobj.size(); i++) {
sortobj.add(listobj.get(i).get(TAG_Name));
sortobj1.add(listobj.get(i).get(TAG_Abbr));
sortobj2.add(listobj.get(i).get(TAG_Area));
sortobj3.add(listobj.get(i).get(TAG_Capital));
if (listobj.get(i).get(TAG_Name).equals("West Bengal"))
break;
}
Collections.sort(sortobj, Collections.reverseOrder());
Collections.sort(sortobj1, Collections.reverseOrder());
Collections.sort(sortobj2, Collections.reverseOrder());
Collections.sort(sortobj3, Collections.reverseOrder());
table = (TableLayout) findViewById(R.id.mytable);
Log.e(TAG, "Sorted in reverse order................ :");
for (int i = 0; i < sortobj.size(); i++) {
TableRow row = new TableRow(getApplicationContext());
TextView tv0 = new TextView(getApplicationContext());
TextView tv1 = new TextView(getApplicationContext());
TextView tv2 = new TextView(getApplicationContext());
TextView tv3 = new TextView(getApplicationContext());
row.setLayoutParams(new TableRow.LayoutParams(
TableRow.LayoutParams.WRAP_CONTENT,
TableRow.LayoutParams.MATCH_PARENT));
tv0.setText(sortobj.get(i));
tv1.setText(sortobj1.get(i));
tv2.setText(sortobj2.get(i));
tv3.setText(sortobj3.get(i));
row.addView(tv0);
row.addView(tv1);
row.addView(tv2);
row.addView(tv3);
table.addView(row, new TableLayout.LayoutParams(
TableLayout.LayoutParams.WRAP_CONTENT,
TableLayout.LayoutParams.MATCH_PARENT));
}
}
};
问题一:
正在对每列进行排序
解法:
对行而不是单元格进行排序。
包括这个 class 并像这样创建 ArrayList List < Row > rows= new ArrayList < Row > ();
class Row implements Comparable<Row>{
String Abb;
String Area;
String Capital;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
String Name;
public String getAbb() {
return Abb;
}
public void setAbb(String abb) {
Abb = abb;
}
public String getArea() {
return Area;
}
public void setArea(String area) {
Area = area;
}
public String getCapital() {
return Capital;
}
public void setCapital(String capital) {
Capital = capital;
}
@Override
public int compareTo(@NonNull Row o) {
return this.Name.compareTo(o.Name);
}
}
现在您可以通过这种方式访问每一列:String Name = rows.get(index).getName();
rows.get(index).setName("Kerala");
然后进行排序,简单的把rows.sort();
问题二:
行附加到现有 table
解法:
在添加已排序的行之前,在循环中使用 removeView() 删除所有行
对于第二部分,您应该使用 removeAllViews()
而不是在循环中使用 removeView()
。如果您的 table 包含与上一个问题中解释的 Row
class 或类似 class 无关的 headers,您可以使用单独的函数来膨胀将行添加回 table.