2016-06-23 1 views
0

구성 저장소를 사용하여 프로젝트에 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 개월 동안 사라졌습니다.

  1. 열 무게를 설정하려고 시도했지만 자동으로 늘어난다면 좋을 것입니다. 정적 무게를 설정하는 데 너무 많은 추측이 있습니다. 잘못했을 경우 표가 제대로 보이지 않거나 한 줄에 여러 줄이 생깁니다.
  2. 테이블을 가로로 스크롤 할 수 없습니다. 스크롤 막대를 표시하지 않으며 스크롤하지 않습니다. 텍스트가 한 줄에 머물러 있기를 원한다면, 컨트롤보다 길면 스크롤하고 싶습니다. 자동으로 스트레치되지 않는다면 필자는 필자가 필요로하는 것보다 더 넓은 열을 설정하고 다시 스크롤하기 만하면됩니다.
  3. 긴 클릭이 실제로 작동하지 않습니다.
  4. 클릭하여 선택한 행을 가져 와서 선택한 색으로 강조 표시 할 수있는 방법이 없습니다.
  5. 내 열 사이에 격자 또는 선을보고 싶습니다.
  6. 열 내부의 텍스트에 중력을 설정하여 정렬이 모두 엉망으로 보이지 않게 할 수는 없습니다. 모든 것을 정당화하거나 중심에 둘 수 있다면 좋을 것입니다. 숫자 5와 마찬가지로 그리드 선을 보면 테이블을 깨끗하게 정리할 수 있습니다.

고마워요!

마이크

+0

MVVM을 수행하지 않습니까? – lokusking

+0

아니요, MVVM을 사용하고 있지 않습니다. –

답변

1

가로로 스크롤하려면이 기능이 유용합니다.

<HorizontalScrollView android:layout_height="0dp" android:layout_weight="2" android:layout_width="wrap_content"> <de.codecrafters.tableview.SortableTableView android:id="@+id/tableView" android:layout_width="match_parent" android:layout_height="match_parent" app:headerElevation="10" app:headerColor="@color/primary" /> </HorizontalScrollView>

+1

잘 모르겠습니다. 사실이 문제와 몇 가지 다른 제한 사항으로 인해 Xamarin 구성 요소를 포기했습니다. SyncFusion의 그리드 구성 요소와 함께갔습니다. 그것은 훌륭하게 작동하고 더 많은 기능을 가지고 있습니다. 그들에는 그들의 통제의 자유로운 지역 사회 판이있다. 나는 당신이 약간 통제를 필요로하는 경우에 그 (것)들을 추천한다. –

+0

조언 해 주셔서 감사합니다. 그러나 SyncFusion의 DataGrid 컨트롤은 datamodel이 필요하고 런타임에만 테이블의 열을 알 수 있기 때문에 가지고 있지 않습니다. – Francesco