コンポーネントストアを使用してソートテーブルビューをプロジェクトに追加し、オンラインドキュメントとサンプルアプリケーションとほぼ同じ方法で実装しました。主な違いは、データとデータのクラスです。だから、基本的に、ここに私が持っているものです。フラグメントは今onCreateViewEDIT - Xamarinコンポーネントソート可能なテーブルビューソートおよびその他のいくつかの問題がありません
string[] headers = { "Batch", "Posted", "Pkg Count", "Recipient" };
var tableHeaderAdapter = new SimpleTableHeaderAdapter(context, headers);
tableHeaderAdapter.SetTextColor(new Android.Graphics.Color(ContextCompat.GetColor(context, Resource.Color.lightText)));
tableHeaderAdapter.SetTextSize(10);
tableView.SetHeaderAdapter(tableHeaderAdapter);
tableView.SetHeaderBackgroundColor(new Android.Graphics.Color(ContextCompat.GetColor(context, Resource.Color.backgroundNormal)));
var rowColorEven = new Android.Graphics.Color(ContextCompat.GetColor(context, Resource.Color.altRowStyleLight));
var rowColorOdd = new Android.Graphics.Color(ContextCompat.GetColor(context, Resource.Color.altRowStyleDark));
tableView.SetDataRowColoriser(TableDataRowColorizers.AlternatingRows(rowColorEven, rowColorOdd));
tableView.HeaderSortStateViewProvider = SortStateViewProviders.BrightArrows();
var dMetrics = Resources.DisplayMetrics;
var width = (int)(dMetrics.WidthPixels * .97);
tableView.LayoutParameters.Width = width;
tableView.SetBackgroundColor(new Android.Graphics.Color(ContextCompat.GetColor(context, Resource.Color.backgroundLight)));
tableView.SetColumnWeight(0, 1);
tableView.SetColumnWeight(1, 1);
tableView.SetColumnWeight(2, 1);
tableView.SetColumnWeight(3, 1);
tableView.SetColumnComparator(0, new BatchIdComparator());
tableView.DataAdapter = new BatchTableDataAdapter(context, batchRecords);
tableView.DataClick += TableView_DataClick;
に来るときこれは、私はすべてが動作しているようだと述べているしたい、1回呼び出されます。私が意味することは、テーブルと私の中のデータが表示されていることです。私はまた、最初の列のヘッダーに並べ替えの矢印を取得します。並べ替えの矢印は処理を実行するように見えますが、ここで問題がどこにあるかがわかります。最初の列はレコードIDのような整数です。 3つのレコード1,2,3があるとしましょう。ソートの矢印をクリックするとトグル表示されますが、レコードは並べ替えられません。しかし、奇妙な点は、TableView_DataClickメソッドのイベントハンドラにブレークポイントを設定してレコードをクリックすると、そのように表示されていなくても実際にソートしていることがわかります。私が意味するのは、列1をクリックすると、1が表示され、ブレークに当たるということです。私はデータが実際には1であることがわかります。しかし、ソートをクリックして1を表示しても、1を表示している場合、データは実際にはブレークの3です。あたかも爽やかではないかのようです。
何か不足していますか?また、私たちはリフレッシュの最中ですが、手動でリフレッシュを開始するにはどうすればよいですか?テーブルの下にリフレッシュボタンを追加します。データがこのクラス以外で変更された場合は、ユーザーが更新ボタンをクリックしてテーブルを更新できるようにします。
要約すると、最初はソートされているように見えますが、ビューに反映されません。また、手動でリフレッシュを開始して新しいデータを取り込む方法もあります。
これは、私が作成しなければならないBatchTableDataAdapterです。私はこれが問題であると考えています。なぜなら、これがインスタンス化されると、onCreateViewで一度、クラスはすべてのテキストビューを返します。後でソートしても、このクラスは再び呼び出されてビューを返すことはありません。
public class BatchTableDataAdapter : TableDataAdapter
{
Context oContext;
List<recBatch> batches;
const int textSize = 12;
public BatchTableDataAdapter(Context context, List<recBatch> Batches)
:base(context, Batches)
{
oContext = context;
batches = Batches;
}
public override View GetCellView(int rowIndex, int columnIndex, ViewGroup parentView)
{
var batchRecord = batches.ElementAt(rowIndex);
View renderedView = null;
switch (columnIndex)
{
case 0:
renderedView = renderBatchID(batchRecord);
break;
case 1:
renderedView = renderPosted(batchRecord);
break;
case 2:
renderedView = renderPkgCount(batchRecord);
break;
case 3:
renderedView = renderRecipient(batchRecord);
break;
}
return renderedView;
}
private View renderBatchID(recBatch batch)
{
var textView = new TextView(oContext);
textView.Text = batch.Batch.ToString();
textView.SetPadding(10, 5, 10, 5);
textView.TextSize = textSize;
return textView;
}
private View renderPosted(recBatch batch)
{
string posted = (string.IsNullOrEmpty(batch.Signature) ? "N" : "Y");
var textView = new TextView(oContext);
textView.Text = posted;
textView.SetPadding(10, 5, 10, 5);
textView.TextSize = textSize;
return textView;
}
private View renderPkgCount(recBatch batch)
{
var textView = new TextView(oContext);
textView.Text = batch.NumPackages.ToString();
textView.SetPadding(10, 5, 10, 5);
textView.TextSize = textSize;
return textView;
}
private View renderRecipient(recBatch batch)
{
var textView = new TextView(oContext);
textView.Text = batch.ToName;
textView.SetPadding(10, 5, 10, 5);
textView.TextSize = textSize;
return textView;
}
}
最後に、これは整数である最初の列の比較です。私はブレークポイントを打つことができ、ソート矢印をクリックすると呼び出され、正しい数値が返されているように見えます。
public class BatchIdComparator : Java.Lang.Object, Java.Util.IComparator
{
public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
{
var lhsCopy = CastJavaObject.Cast<recBatch>(lhs);
var rhsCopy = CastJavaObject.Cast<recBatch>(rhs);
if (lhsCopy.Batch < rhsCopy.Batch)
{
return -1;
}
if (lhsCopy.Batch > rhsCopy.Batch)
{
return 1;
}
return 0;
//return lhsCopy.Batch.CompareTo(rhsCopy.Batch);
}
}
EDIT:私は今、他の問題を抱えています。私は分類をあきらめていたが、これらの他の問題は私をイライラさせている。私が恩恵を申し出るのに十分であれば、私はそうするでしょう。しかし、私はまだ新しくなっているので、あまりにも多くはありませんので、私は頼むだけです。助けてください。 SOの投稿とXamarinフォーラムの投稿の両方は1.5ヶ月間未回答でした。 申し訳ありませんが、まだこれに問題があり、ここのスレッドは答えなしで1.5ヶ月間消えてしまっています。
- 私は列の重みを設定しようとしましたが、自動的に伸びるといいでしょう。静的な重さを設定するにはあまりにも多くの推測があり、それが間違っている場合は、テーブルが正しく表示されないか、行内に複数の行が表示されます。
- テーブルを水平にスクロールすることができません。スクロールバーを表示せず、スクロールしません。テキストがコントロールより長い場合は、テキストを1行に残しておき、スクロールしたい。それが自動的に伸びないなら、私は必要以上にカラムを広げたいと思っています。単にスクロールするだけです。
- 長いクリックは実際には機能しません。
- クリックした行を取得して、色が選択されていることを示す色にハイライト表示する方法はありません。
- 私の列の間にグリッドや線が表示されます。
- 列内のテキストに重力を設定することはできません。それを正当化するか、それをすべて中央に置くことができるのは良いことです。番号5のように、グリッド線を見ることで、表をきれいに整列させることができます。
ありがとう!
マイク
MVVMをやっていませんか? – lokusking
いいえ、MVVMを使用していません。 –