2015-02-09 47 views
1

我想通過使用新的Recycler視圖列出數據。我一直在跟着這個tutorial &現在面臨的問題。android.widget.LinearLayout不能轉換爲RecyclerView中的android.widget.TextView?

這裏是我的

MainActivity.java

package com.example.i.newworkspace; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class MainActivity extends ActionBarActivity { 

TextView tv; 
RecyclerView recyclerView; 
RecyclerView.Adapter mAdapter; 
String[] myDataset = {"One","Two","Three","Four","Five"}; 

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

    recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    recyclerView.setHasFixedSize(true); 
    mAdapter = new MyAdapter(myDataset); 
    recyclerView.setAdapter(mAdapter); 

} 


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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

} 
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> 

{ 
    String[] mDataset; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTextView; 
     public ViewHolder(TextView v) { 
      super(v); 
      mTextView = v; 
     } 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.my_text_view, null, false); 
     ViewHolder vh = new ViewHolder((TextView) v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     holder.mTextView.setText(mDataset[position]); 

    } 

    @Override 
    public int getItemCount() { 
     return mDataset.length; 
    } 

    MyAdapter(String[] myDataset) { 
     mDataset = myDataset; 
    } 
} 

activity_main.xml中

<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <android.support.v7.widget.RecyclerView 

     android:id="@+id/recyclerview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    </android.support.v7.widget.RecyclerView> 

</RelativeLayout> 

my_text_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

的logcat:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 
       at com.example.i.newworkspace.MyAdapter.onCreateViewHolder(MainActivity.java:78) 
       at com.example.i.nuewworkspace.MyAdapter.onCreateViewHolder(MainActivity.java:59) 

78號線:

 ViewHolder vh = new ViewHolder((TextView) v); 
+0

清理項目,然後再試一次.. – 2015-02-09 10:37:27

+0

@MurtazaHussain我試過了。但是,還是一樣的錯誤。 – user3289108 2015-02-09 10:38:56

回答

5

你應該注意到,您的my_text_view.xml是如此的LinearLayout:

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView mTextView; 
    public ViewHolder(View v) { 
     super(v); 
     // Find the TextView in the LinearLayout 
     mTextView = v.findViewById(R.id.textView)); 
    } 
} 

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.my_text_view, parent, false); 
    // Give the view as it is 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 
+0

謝謝,它工作。 – user3289108 2015-02-09 11:04:04

+0

嘿@Gorcyn,它顯示的數據,但不像舊格式的列表視圖。我的意思是沒有分頻器和所有。我怎麼做? – user3289108 2015-02-09 11:14:56

+0

@ user3289108對這個問題的回答應該有所幫助:http://stackoverflow.com/questions/24618829/how-to-add-dividers-and-spaces-between-items-in-recyclerview ;) – Gorcyn 2015-02-09 13:30:51

1

您試圖投出的LinearLayout到TextView的。

改變這一行:

ViewHolder vh = new ViewHolder((TextView) v);

到:

ViewHolder vh = new ViewHolder((TextView) v.findViewById(R.id.textView));

+0

ViewHolder在這裏保持對相關視圖的引用,所以我們應該總是給他一個「根」的視圖,讓它找到它需要的信息 – Gorcyn 2015-02-09 10:46:37

+0

謝謝,我沒有三分之一..我知道這將運行。但是,我更願意發送根視圖作爲參數。 +1幫助:) – user3289108 2015-02-09 11:11:49

+0

@Gorcyn你是對的!我忘了根視圖--- user3289108謝謝:) – Rami 2015-02-09 11:26:22

1

膨脹的視圖包含根元素太多,所以u需要通過findviewbyid函數來創建你的TextView,然後將它傳遞給ViewHolder構造

@Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.my_text_view, null, false); 
     TextView tv=(TextView)v.findViewById(R.id.textView); 
     ViewHolder vh = new ViewHolder(tv); 
     return vh; 
    } 

好運

相關問題