2016-10-31 7 views
-1

私はソート用のボタンを持つ複数の値でカスタムリストビューを作成しようとしています。このように、リストビューは年、名前、価格などの異なる値でソートすることができます。Androidスタジオボタンを使用してカスタムリストビューを並べ替える

私はAndroidスタジオと一般的なコーディングでまだかなり新しいです。

問題は、いずれかのボタンを押すとソートされません。私は、数値的に昇順で並べ替えるために比較関数を使ってみましたが、それはうまくいかない(何もエラーを起こさず、何も起こりません)。ここで

は、最初に私のカスタム列を示す、私が試したもので、その後、カスタムリストアダプタ:

マイカスタム行レイアウト:

<TextView 
     android:layout_width="40dp" 
     android:layout_height="35dp" 
     android:layout_marginLeft="10dp" 
     android:text="Time:" 
     android:id="@+id/time_label_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

    <TextView 
     android:layout_width="40dp" 
     android:layout_height="35dp" 
     android:text="time" 
     android:id="@+id/time_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

    <TextView 
     android:layout_width="40dp" 
     android:layout_height="35dp" 
     android:layout_marginLeft="10dp" 
     android:text="Price:" 
     android:id="@+id/price_label_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

    <TextView 
     android:layout_width="40dp" 
     android:layout_height="35dp" 
     android:text="price" 
     android:id="@+id/price_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

    <TextView 
     android:layout_width="40dp" 
     android:layout_height="35dp" 
     android:layout_marginLeft="10dp" 
     android:text="Year:" 
     android:id="@+id/year_label_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="35dp" 
     android:text="year" 
     android:id="@+id/year_row" 
     android:gravity="center" 
     android:layout_weight="1"/> 

</LinearLayout> 

<View 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:background="@color/colorPrimaryDark" 
    /> 

私のカスタムリストビューここinsteresting(ボタンのみ):

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="50dp"> 
<Button 
    android:text="Time" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/sort_time" 
    android:layout_weight="1" 
    android:onClick="TimeSortClick"/> 

<Button 
    android:text="Price" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/sort_price" 
    android:layout_weight="1" 
    android:onClick="PriceSortClick"/> 

<Button 
    android:text="Year" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/sort_year" 
    android:layout_weight="1" 
    android:onClick="YearSortClick"/> 

</LinearLayout> 

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/list_view" 
    android:smoothScrollbar="true"/> 

マイカスタムアダプタ:

public class CustomAdapter extends BaseAdapter { 
String [] result1; 
String [] result2; 
String [] result3; 
Context context; 

private static LayoutInflater inflater=null; 
public CustomAdapter(ListViewActivity mainActivity, String[] priceOrderList, String [] timeOrderList, String [] yearOrderList) { 
    // TODO Auto-generated constructor stub 
    result1=priceOrderList; 
    result2=timeOrderList; 
    result3=yearOrderList; 
    context=mainActivity; 
    inflater = (LayoutInflater)context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return result1.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; 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    Holder holder=new Holder(); 
    View rowView; 
    rowView = inflater.inflate(R.layout.row_layout, null); 
    holder.tv=(TextView) rowView.findViewById(R.id.price_row); 
    holder.tv.setText(result1[position]); 
    holder.tv=(TextView) rowView.findViewById(R.id.time_row); 
    holder.tv.setText(result2[position]); 
    holder.tv=(TextView) rowView.findViewById(R.id.year_row); 
    holder.tv.setText(result3[position]); 
    rowView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "You Clicked "+result1[position], Toast.LENGTH_LONG).show(); 
     } 
    }); 
    return rowView; 
} 

私の(私は私のカスタムリストビューを膨らままたは活性)のListView Activitiy:とにかく

public class ListViewActivity extends Activity implements View.OnClickListener { 

ListView view_list; 
Context context; 

ArrayList priceOrder; 
public static String [] priceOrderList={"50$","100$","120$","40$"}; 
public static String [] timeOrderList={"10min","12min","5min","4min"}; 
public static String [] yearOrderList={"2010","2011","2012","2004"}; 

private Button mTimeButton; 
private Button mPriceButton; 
private Button mYearButton; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list_view); 

    context=this; 

    mTimeButton = (Button) findViewById(R.id.sort_time); 
    mPriceButton = (Button) findViewById(R.id.sort_price); 
    mYearButton = (Button) findViewById(R.id.sort_year); 
    view_list = (ListView) findViewById(R.id.list_view); 
    view_list.setAdapter(new CustomAdapter(this, priceOrderList, timeOrderList, yearOrderList)); 

    mTimeButton.setOnClickListener(this); 
    mPriceButton.setOnClickListener(this); 
    mYearButton.setOnClickListener(this); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onClick(View v) { 
    if (v == mPriceButton){ 

     String pricesort = ("Sorting for Price"); 

     Toast.makeText(ListViewActivity.this, pricesort, Toast.LENGTH_SHORT).show(); 

     Comparator<String> StringAscComparator = new Comparator<String>() { 

      public int compare(String app1, String app2) { 

       String stringName1 = app1; 
       String stringName2 = app2; 

       return stringName1.compareToIgnoreCase(stringName2); 
      } 
     }; 

     Collections.sort(Arrays.asList(priceOrderList), StringAscComparator); 

    } else if (v == mTimeButton){ 

     String timesort = ("Sorting for Time"); 

     Toast.makeText(ListViewActivity.this, timesort, Toast.LENGTH_SHORT).show(); 

     Comparator<String> StringAscComparator = new Comparator<String>() { 

      public int compare(String app1, String app2) { 

       String stringName1 = app1; 
       String stringName2 = app2; 

       return stringName1.compareToIgnoreCase(stringName2); 
      } 
     }; 

     Collections.sort(Arrays.asList(timeOrderList), StringAscComparator); 

    } else if (v == mYearButton){ 

     String yearsort = ("Sorting for Year"); 

     Toast.makeText(ListViewActivity.this, yearsort, Toast.LENGTH_SHORT).show(); 

     Comparator<String> StringAscComparator = new Comparator<String>() { 

      public int compare(String app1, String app2) { 

       String stringName1 = app1; 
       String stringName2 = app2; 

       return stringName1.compareToIgnoreCase(stringName2); 
      } 
     }; 

     Collections.sort(Arrays.asList(yearOrderList), StringAscComparator); 

    } 
} 

、助けてくれてありがとう!大変感謝しています!

+0

POJOの1つの配列は明らかに3つの配列を使用しています。(たとえあなたが間違った項目を取得してもアダプタに通知しても)(priceOrderはyearOrderに収まらない)... [別の問題は文字列と数値の順序です] http://ideone.com/lWQPg5)... – Selvin

+0

データの意味を少し良く理解してください。価格は時間と年に関連付けられているため、価格/時間/年が何らかのエンティティを構成していますか?そして、異なるフィールドのそれぞれでエンティティを並べ替えるだけですか?私はあなたがリスト項目の各フィールドの1つを持って参照してください...または単にあなたの価格を表示する時間を表示すると言うからリストを変更していますか? –

+0

@Selvinは、私が試したようなリストビューを作る別の方法があります。そこでは、3つの値すべてを並べ替えることができますか?私は私のアプローチが間違っていて理にかなっていませんが、それを行うには別の方法が必要ですか? :) –

答えて

-1

配列をソートする方法を記述します。もう1つパラメータをアダプタコンストラクタに追加します.btnのアダプタを再度割り当てます。 view_list.setAdapter(new CustomAdapter(this, priceOrderList, sortArray(timeOrderList), yearOrderList,2)); のように、新しいパラメータに基づいて値をアダプタからlistviewに割り当てます。

PS:このここに書き込むコメントを申し訳ありませんが、低担当者:)

+0

ソート後に 'Adapter.notifyDatasetChanged'を呼び出すと、(新しい' CustomAdapter'インスタンスを作成せずに)よりうまくいくでしょう...しかし、コメントに書いたように、別の問題が発生します – Selvin

+0

他の問題はありますか?ここでそれを言いたいことはありますか? – Shahal

+0

*他に何か問題がありますか?あなたはここに言及していただけますか?* ...あなたが理解していないようです:***しかし、私はコメント***に書いたように? – Selvin

1

彼のコメントで、@Selvinはあなたのデータを関連付けるためにPOJOを使用することを提案し、それは素晴らしいアイデアです。それはあなたのデータのための適切なデータ型を見つけるのがベストです:

public class Item { 

     public BigDecimal price; // why BigDecimal? http://stackoverflow.com/a/8148773/4504191 

     public Duration time;  // this is from the new java.time API in v8 

     public int year;   // java.time also has a Year class 

    } 

適切なクラスは、(読者の練習として残し)セッターとゲッターとのプライベートなフィールドを持っているでしょう。

アダプターにはList<Item>しかありません。

これらのデータ型もまた、比較ロジックを簡単にします。

これを行う方法はとてもたくさんあります。私は私がするだろうことは、コンパレータを指定して、リストをソートするために、アダプタのメソッドを作成していると思う:

 public void sortUsing(Comparator<Item> comparator) { 

      Collections.sort(list, comparator); 
      notifyDataSetChanged(); 
     } 

それから私は、3個の異なるコンパレータに各フィールド—について—を作成し、対応する際に、適切なコンパレータを渡しますソートボタンが押されました。ここに時間のバージョンがあります:

 Comparator<Item> timeComparator = new Comparator<Item> { 

      @Override 
      int compare(Item lhs, Item rhs) { 
       return lhs.time.compareTo(rhs.time); 
      } 
     } 
関連する問題