구성 저장소를 사용하여 프로젝트에 Sortable Table View를 추가했으며이를 온라인 설명서 및 샘플 응용 프로그램과 거의 동일하게 구현했습니다. 주요 차이점은 물론 데이터 및 데이터 클래스입니다. 그래서, 기본적으로, 여기에 제가 가진 것이 있습니다. 조각 지금 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;
에 올 때 이것은 내가 모두 작동하는 것 같군 것을 주장하려면, 한 번 호출됩니다. 내 말은 테이블과 데이터를 볼 수 있다는 것입니다. 또한 첫 번째 열 머리글에 정렬 화살표가 나타납니다. 정렬 화살표는 작업을 수행하는 것처럼 보이지만 여기에는 문제가있는 부분이 있습니다. 첫 번째 열은 레코드 ID와 같은 정수입니다. 3 개의 레코드, 1, 2 및 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);
}
}
편집 :은 지금 다른 문제가 있어요. 정렬을 포기했지만 다른 문제는 절 실망 스럽습니다. 제가 현상금을 낼만큼 충분하다면 그렇게 할 것입니다. 그러나, 나는 너무 많이 새로운 것은 아니다. 그래서 나는 단지 묻는다, 도와주세요. SO 게시물과 Xamarin 포럼 게시물 모두 1.5 개월 동안 답변을 얻지 못했습니다. 그래도 문제가 계속되고 여기 스레드가 대답없이 1.5 개월 동안 사라졌습니다.
- 열 무게를 설정하려고 시도했지만 자동으로 늘어난다면 좋을 것입니다. 정적 무게를 설정하는 데 너무 많은 추측이 있습니다. 잘못했을 경우 표가 제대로 보이지 않거나 한 줄에 여러 줄이 생깁니다.
- 테이블을 가로로 스크롤 할 수 없습니다. 스크롤 막대를 표시하지 않으며 스크롤하지 않습니다. 텍스트가 한 줄에 머물러 있기를 원한다면, 컨트롤보다 길면 스크롤하고 싶습니다. 자동으로 스트레치되지 않는다면 필자는 필자가 필요로하는 것보다 더 넓은 열을 설정하고 다시 스크롤하기 만하면됩니다.
- 긴 클릭이 실제로 작동하지 않습니다.
- 클릭하여 선택한 행을 가져 와서 선택한 색으로 강조 표시 할 수있는 방법이 없습니다.
- 내 열 사이에 격자 또는 선을보고 싶습니다.
- 열 내부의 텍스트에 중력을 설정하여 정렬이 모두 엉망으로 보이지 않게 할 수는 없습니다. 모든 것을 정당화하거나 중심에 둘 수 있다면 좋을 것입니다. 숫자 5와 마찬가지로 그리드 선을 보면 테이블을 깨끗하게 정리할 수 있습니다.
고마워요!
마이크
MVVM을 수행하지 않습니까? – lokusking
아니요, MVVM을 사용하고 있지 않습니다. –