1

私はCardViewを使ってニュースレターを持つカードのリストを作成しています。基本的な要素は3 TextViews + 1 ImageViewです。私は2つの要素を適切に膨張させることはできません:タイトルは問題ありませんが、リンクテキストは間違った文字列を取得します(ボディテキストを参照する文字列を取得します)。RecyclerView + CardView:間違ったデータを膨張させる

AERES一般ideiaと絵:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
tools:context=".News"> 

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card1_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardCornerRadius="4dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/news_title" 
      android:layout_width="match_parent" 
      android:layout_height="40dp" 
      android:paddingLeft="8dp" 
      android:text="articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle articleTitle " 
      android:textColor="#000000" 
      android:textSize="16sp" 
      android:textStyle="bold" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      android:orientation="horizontal"> 

      <LinearLayout 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="6" 
       android:orientation="vertical"> 

       <TextView 
        android:id="@+id/news_link" 
        android:layout_width="match_parent" 
        android:layout_height="25dp" 
        android:gravity="center_vertical" 
        android:paddingLeft="8dp" 
        android:text="http://www.articleLink.com/" /> 

       <TextView 
        android:id="@+id/news_body" 
        android:layout_width="match_parent" 
        android:layout_height="120dp" 
        android:paddingLeft="8dp" 
        android:text="Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body Body ..." 
        android:textColor="#000000" /> 
      </LinearLayout> 

      <ImageView 
       android:id="@+id/news_photoId" 
       android:layout_width="0dp" 
       android:layout_height="145dp" 
       android:layout_weight="5" 
       android:src="@drawable/enfnotum" /> 

     </LinearLayout> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="20dp" 
      android:gravity="end" 
      android:paddingEnd="6dp" 
      android:paddingRight="6dp" 
      android:text="Coments Share" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="#bab7b7" /> 

    </LinearLayout> 


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

RecycleViewリストのレイアウト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" 
tools:context=".News"> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/rv" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

preview on android studio (left) and app running on device(right)

これは私のCardViewのXMLコードであります今

Javaクラス:ここ イムアダプタレイアウト

を膨らま

public class News extends AppCompatActivity { 

    private List<Article> articles = new ArrayList<>(); 
    private RecyclerView rv; 

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

     rv = (RecyclerView) findViewById(R.id.rv); 
     LinearLayoutManager llm = new LinearLayoutManager(this); 
     rv.setLayoutManager(llm); 

     initializeData(); 
     initializeAdapter(); 
    } 

    private void initializeData() { 
     articles.add(new Article("0title", "0link", "0body", R.drawable.enfnotum)); 
     articles.add(new Article("1title", "1link", "1body", R.drawable.enfnoticias)); 
     articles.add(new Article("2title", "2link", "2body", R.drawable.image1)); 
     articles.add(new Article("3title", "3link", "3body", R.drawable.image2)); 
     articles.add(new Article("4title", "4link", "4body", R.drawable.image3)); 
     articles.add(new Article("5title", "5link", "5body", R.drawable.enfnotum)); 
     articles.add(new Article("6title", "6link", "6body", R.drawable.image3)); 
     articles.add(new Article("7title", "7link", "7body", R.drawable.enfnoticias)); 
     //TODO: database 
    } 

    private void initializeAdapter() { 
     NewsRVAdapter adapter = new NewsRVAdapter(articles); 
     rv.setAdapter(adapter); 
    } 
} 

リストオブジェクトを作成するために、私クラッセ、いくつかのゲッター

public class Article { 

    private String articleTitle; 
    private String articleLink; 
    private String articleBody; 
    private int articlePhotoId; 

    public Article(String articleTitle, String articleLink, String articleBody, int articlePhotoId) { 
     this.articleTitle = articleTitle; 
     this.articleLink = articleLink; 
     this.articleBody = articleBody; 
     this.articlePhotoId = articlePhotoId; 
    } 

    public String getArticleTitle() { 
     return articleTitle; 
    } 

    public String getArticleLink() { 
     return articleLink; 
    } 

    public String getArticleBody() { 
     return articleBody; 
    } 

    public int getArticlePhotoId() { 
     return articlePhotoId; 
    } 
} 

呼び出して、リストを取り込みます

public class NewsRVAdapter extends RecyclerView.Adapter<NewsRVAdapter.ArticleViewHolder> { 

    List<Article> articles; 

    NewsRVAdapter(List<Article> articles) { 
     this.articles = articles; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public ArticleViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item_list, viewGroup, false); 
     return new ArticleViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ArticleViewHolder ArticleViewHolder, int position) { 
     ArticleViewHolder.articleTitle.setText(articles.get(position).getArticleTitle()); 
     ArticleViewHolder.articleLink.setText(articles.get(position).getArticleLink()); 
     ArticleViewHolder.articleLink.setText(articles.get(position).getArticleBody()); 
     ArticleViewHolder.articlePhotoID.setImageResource(articles.get(position).getArticlePhotoId()); 
    } 

    @Override 
    public int getItemCount() { 
     return articles.size(); 
    } 

    public static class ArticleViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView articleTitle; 
     TextView articleLink; 
     TextView articleBody; 
     ImageView articlePhotoID; 

     ArticleViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView) itemView.findViewById(R.id.card1_view); 
      articleTitle = (TextView) itemView.findViewById(R.id.news_title); 
      articleLink = (TextView) itemView.findViewById(R.id.news_link); 
      articleBody = (TextView) itemView.findViewById(R.id.news_body); 
      articlePhotoID = (ImageView) itemView.findViewById(R.id.news_photoId); 
     } 
    } 
} 

答えて

1

見るタイプミスのようです。あなたはonBindViewHolder上の間違いを持っ​​て

@Override 
public void onBindViewHolder(ArticleViewHolder ArticleViewHolder, int position) { 
ArticleViewHolder.articleTitle.setText(articles.get(position).getArticleTitle()); 
ArticleViewHolder.articleLink.setText(articles.get(position).getArticleLink()); 
ArticleViewHolder.articleBody.setText(articles.get(position).getArticleBody()); 
ArticleViewHolder.articlePhotoID.setImageResource(articles.get(position).getArticlePhotoId()); 
} 
+0

私は大嫌いです。 – RCO

0

:とあなたのNewsRVAdapterさんonBindViewHolderを交換してみてください。 articleLinkを2回参照していました。

それは理由が

@Override public void onBindViewHolder(ArticleViewHolder ArticleViewHolder, int position) { ArticleViewHolder.articleTitle.setText(articles.get(position).getArticleTitle()); ArticleViewHolder.**articleLink**.setText(articles.get(position).getArticleLink()); ArticleViewHolder.**articleLink**.setText(articles.get(position).getArticleBody()); ArticleViewHolder.articlePhotoID.setImageResource(articles.get(position).getArticlePhotoId()); } 

^^
onBindViewHolder ArticleViewHolderであなたの間違ったコードです

@Override 
public void onBindViewHolder(ArticleViewHolder ArticleViewHolder, int position){ 
    ArticleViewHolder.articleTitle.setText(articles.get(position).getArticleTitle()); 
    ArticleViewHolder.articleLink.setText(articles.get(position).getArticleLink()); 
    ArticleViewHolder.articleBody.setText(articles.get(position).getArticleBody()); 
    ArticleViewHolder.articlePhotoID.setImageResource(articles.get(position).getArticlePhotoId()); 
} 
1

されている必要があります。 articleLinkに2回割り当てられ、その値がオーバーライドされました。

訂正してください。

関連する問題