2017-07-20 22 views
0

APIからデータを取得してリストビューに読み込みますが、データが入力されるとリストビューが乱雑になります。ListViewはLinearLayoutで作成されました。

私がしたい正確に何である私のlistview_row.xmlのコード

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:autofit="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_marginTop="20dp" 
     android:weightSum="2"> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="5dp" 
       android:textSize="15sp" 
       android:textStyle="bold" 
       android:text="BTC/AUD"/> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="5dp" 
       android:textSize="15sp" 
       android:textStyle="bold" 
       android:text="LTC/BTC"/> 
     </LinearLayout> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:layout_marginTop="5dp" 
     android:weightSum="2"> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:background="@drawable/custom_background" 
      android:orientation="horizontal" 
      android:weightSum="3"> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Time" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvTimeBtcToAud" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvVolBtcToAud" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Vol" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvPriceBtcToAud" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Price" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

     </LinearLayout> 



     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:background="@drawable/custom_background" 
      android:orientation="horizontal" 
      android:weightSum="3"> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Time" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvTimeLtcToBtc" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvVolLtcToBtc" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Vol" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_margin="10dp" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <me.grantland.widget.AutofitTextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:maxLines="1" 
        android:text="Price" 
        android:textStyle="bold" 
        autofit:minTextSize="6sp" /> 

       <me.grantland.widget.AutofitTextView 
        android:id="@+id/tvPriceLtcToBtc" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:maxLines="1" 
        autofit:minTextSize="6sp" /> 

      </LinearLayout> 

     </LinearLayout> 

    </LinearLayout> 

</LinearLayout> 

私は、Android Studioのデザイン]タブを開くと、私はこれを参照してください。activity_main.xml

Custom layout for list view

コード

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.byteshaft.tradealerterbtcm.MainActivity" 
    android:id="@+id/ll_all_data"> 

    <ListView 
     android:id="@+id/lv_all_data" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:layout_marginBottom="5dp" 
     android:divider="@null"> 
    </ListView> 

</LinearLayout> 

MainActivityのコードで、データを取得してリストビューにデータを入力しています:

public class MainActivity extends AppCompatActivity { 


    ListView lvAllData; 
    ListAdapter listAdapter; 

    ArrayList<Integer> ListIds; 
    HashMap<Integer, ArrayList<String>> hashMapList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lvAllData = (ListView) findViewById(R.id.lv_all_data); 
     getBtcToAud(); 
    } 

    private void getBtcToAud() { 
     HttpRequest request = new HttpRequest(MainActivity.this); 
     request.setOnReadyStateChangeListener(new HttpRequest.OnReadyStateChangeListener() { 
      @Override 
      public void onReadyStateChange(HttpRequest request, int readyState) { 
       switch (readyState) { 
        case HttpRequest.STATE_DONE: 
         switch (request.getStatus()) { 
          case HttpURLConnection.HTTP_OK: 
           onDataFetchSuccess(request.getResponseText()); 
           break; 
          default: 
           onDataFetchFailed(request.getResponseText()); 
           break; 
         } 
       } 
      } 
     }); 
     request.setOnErrorListener(new HttpRequest.OnErrorListener() { 
      @Override 
      public void onError(HttpRequest request, int readyState, short error, Exception exception) {} 
     }); 
     request.open("GET", "https://api.btcmarkets.net/market/BTC/AUD/trades"); 
     request.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
     request.send(); 
    } 

    private void onDataFetchSuccess(String response) { 
     Toast.makeText(MainActivity.this, "Data fetch successful", Toast.LENGTH_SHORT).show(); 
     Log.i("data", "" + response); 
     ListIds = new ArrayList<>(); 
     hashMapList = new HashMap<>(); 
     try { 
      JSONArray jsonArray = new JSONArray(response); 
      for (int i = 0; i < 20 ; i++) { 
       JSONObject jsonObject = new JSONObject(jsonArray.get(i).toString()); 
       int id = jsonObject.getInt("tid"); 
       Log.e("object", "" + jsonObject); 
       if (!ListIds.contains(id)) { 
        ListIds.add(id); 
        ArrayList<String> tempArrayListData = new ArrayList<>(); 
        tempArrayListData.add(jsonObject.getString("date")); 
        tempArrayListData.add(jsonObject.getString("amount")); 
        tempArrayListData.add(jsonObject.getString("price")); 
        hashMapList.put(id, tempArrayListData); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     listAdapter = new ListAdapter(MainActivity.this, R.layout.listview_row, 
       ListIds); 
     lvAllData.setAdapter(listAdapter); 
    } 

    private void onDataFetchFailed(String response) { 
     Toast.makeText(MainActivity.this, "Data fetch failed", Toast.LENGTH_SHORT).show(); 
     Log.e("failed", "" + response); 
    } 

    private class ListAdapter extends ArrayAdapter<String> { 

     ArrayList<Integer> arrayListIds; 

     ListAdapter(Context context, int resource, ArrayList<Integer> ids) { 
      super(context, resource); 
      arrayListIds = ids; 
     } 

     @Override 
     public View getView(final int position, View convertView, @NonNull ViewGroup parent) { 
      ViewHolder viewHolder; 
      if (convertView == null) { 
       viewHolder = new ViewHolder(); 
       LayoutInflater layoutInflater = getLayoutInflater(); 
       convertView = layoutInflater.inflate(R.layout.listview_row, parent, false); 

       viewHolder.tvTimeBtcToAud = convertView.findViewById(R.id.tvTimeBtcToAud); 
       viewHolder.tvVolBtcToAud = convertView.findViewById(R.id.tvVolBtcToAud); 
       viewHolder.tvPriceBtcToAud = convertView.findViewById(R.id.tvPriceBtcToAud); 
       AutofitHelper.create(viewHolder.tvTimeBtcToAud); 
       AutofitHelper.create(viewHolder.tvVolBtcToAud); 
       AutofitHelper.create(viewHolder.tvPriceBtcToAud); 

//    viewHolder.tvTimeLtcToBtc = convertView.findViewById(R.id.tvTimeLtcToBtc); 
//    viewHolder.tvVolLtcToBtc = convertView.findViewById(R.id.tvVolLtcToBtc); 
//    viewHolder.tvPriceLtcToBtc = convertView.findViewById(R.id.tvPriceLtcToBtc); 
       convertView.setTag(viewHolder); 
      } else { 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 
      viewHolder.tvTimeBtcToAud.setText(hashMapList.get(arrayListIds.get(position)).get(0)); 
      viewHolder.tvVolBtcToAud.setText(hashMapList.get(arrayListIds.get(position)).get(1)); 
      viewHolder.tvPriceBtcToAud.setText(hashMapList.get(arrayListIds.get(position)).get(2)); 

//   viewHolder.tvTimeLtcToBtc.setText(); 
//   viewHolder.tvVolLtcToBtc.setText(); 
//   viewHolder.tvPriceLtcToBtc.setText(); 
      return convertView; 
     } 

     @Override 
     public int getCount() { 
      return arrayListIds.size(); 
     } 
    } 

    private static class ViewHolder { 
     AutofitTextView tvTimeBtcToAud; 
     AutofitTextView tvVolBtcToAud; 
     AutofitTextView tvPriceBtcToAud; 
     AutofitTextView tvTimeLtcToBtc; 
     AutofitTextView tvVolLtcToBtc; 
     AutofitTextView tvPriceLtcToBtc; 
    } 

、データが移入されたときには、次のようになります。

Actual

私は私が何かをやっていることを知っている:私は私のレイアウトをしたい Messed Up data

には、以下の画像のように見えることですDひどく間違っていますが、私はそれを理解できません。 提案がありますか?

答えて

1

リスト項目のコード見出しで、listview_row.xmlファイルで定義します。その代わりにheadingコードをactivity_main.xmlに移動します。リスト項目の詳細のみをlistview_row.xmlファイルに追加します。

コードでは、各行の見出しとデータを入力しています。一度ヘッダーの一部をmain xmlファイルに移動しました。

// ViewHolderクラス のTextView listHeadingでこのIDを読み

<LinearLayout 
     android:id="@+id/list_heading" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_marginTop="20dp" 
     android:weightSum="2"> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:textSize="15sp" 
      android:textStyle="bold" 
      android:text="BTC/AUD"/> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:textSize="15sp" 
      android:textStyle="bold" 
      android:text="LTC/BTC"/> 
    </LinearLayout> 
    </LinearLayout> 

その後listview_row.xmlにIDこれを追加します。位置は以下の通り> 0であれば

今、この見出しをコメントしよう:

 if(position==0){ 
viewHolder.listHeading.setText(hashMapList.get(arrayListIds.get(position)).get(0)); 
} 

XMLでのListViewのために分周器の高さ0にします。

は最後に、あなたは時間、巻のため、変更のこれらの種類を行う必要があり、価格

+0

私はそれを行うだろうか任意の提案を見出し? –

+0

上記の更新された回答を確認してください。前述のようにコードを移動する必要はありません。これらの変更を変更するだけです。 –

関連する問題