简体   繁体   中英

On setAdapter it does not invoke getView method of Adapter

The problem is getView method does not get called even when I do setAdapter on listView. Please see may code below. I dont get any error message. It just does not display reviewer data. Would you please suggest what I am doing incorrect.

MovieReviewerFragmemt class I have below code:

    @Override
    protected void onPostExecute (ArrayList movieDetailsArray){
        getMovieArrayList(movieDetailsArray);
        ListView listView = (ListView)                                    rootView.findViewById(R.id.movie_detail_reviewerlist);
        MovieAddlDetail detail = (MovieAddlDetail) movieDetailsArray.get(0);
        MovieReviewers[] list = detail.getReviewerArrayList();
        Log.v(LOG_TAG, "MovieReviewerFragment - CustomReviewerAdapter - calling adapter");
        movieDetailAdapter = new CustomReviewerAdapter(getActivity(), list);
        movieDetailAdapter.notifyDataSetChanged();
        listView.setAdapter(movieDetailAdapter);
    }

CustomerReviewAdapter:

public class CustomReviewerAdapter extends ArrayAdapter {
private Context context;
private LayoutInflater inflater;
private final String LOG_TAG1 = CustomReviewerAdapter.class.getSimpleName();
private MovieReviewers[] reviewers;

public CustomReviewerAdapter(Context context, MovieReviewers[] reviewers) {
    super(context, R.layout.fragment_detail, reviewers);
    Log.v(LOG_TAG1, "CustomReviewerAdapter - constructor");
    this.context = context;
    this.reviewers = reviewers;

    inflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.v(LOG_TAG1, "CustomReviewerAdapter - getView");
    if (convertView == null) {
        inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.fragment_detail_reviewer, parent, false);
        Log.v(LOG_TAG1, "CustomReviewerAdapter - getView - convertview was null");

    }
    TextView textView1 = (TextView) convertView.findViewById(R.id.movie_detail_reviewerlist_author);
    TextView textView2 = (TextView) convertView.findViewById(R.id.movie_detail_reviewerlist_content);
    textView1.setText(reviewers[position].getAuthor());
    textView2.setText(reviewers[position].getContent());
    Log.v(LOG_TAG1, "CustomReviewerAdapter - getView - data set");
    return convertView;
}

}

Fragment Detail Reviewer:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id ="@+id/imageView_layout"
android:orientation = "vertical">

<TextView
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:id="@+id/movie_detail_reviewerlist_author"
    android:textAlignment="center"
    android:textStyle="bold"
    android:gravity="center_vertical"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:descendantFocusability="blocksDescendants"/>

<TextView
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:id="@+id/movie_detail_reviewerlist_content"
    android:textAlignment="center"
    android:textStyle="bold"
    android:gravity="center_vertical"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:descendantFocusability="blocksDescendants"/>

Fragment Detail:

<?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">

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/movie_detail_list"
    android:editable="false" />

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/movie_detail_reviewerlist"
    android:editable="false" />

Below is activity from which fragment is being initiated. The first fragment is working fine and is being displayed. However the second fragment is where I dont get anything displayed. Is below correct way to initiate two fragments?

Detail Activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
    Bundle extras = getIntent().getExtras();
    intentData = extras.getStringArray("moviedetails");
    MovieDetailFragment movieDetailFragment = new MovieDetailFragment();
    movieDetailFragment.setMovieDetails(intentData);
    MovieReviewerFragment movieReviewerFragment = new MovieReviewerFragment();
    movieReviewerFragment.setMovieDetails(intentData);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container_1, movieDetailFragment)
                .add(R.id.container_2, movieReviewerFragment)
                .commit();
    }
}

您必须像这样调用LayoutInflater:

inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

You have to switch the lines

movieDetailAdapter.notifyDataSetChanged();
listView.setAdapter(movieDetailAdapter);

To

listView.setAdapter(movieDetailAdapter);
movieDetailAdapter.notifyDataSetChanged();

First you set the adapter, then you send the notification. If you do this the reverse way, there is no ListView which may display the updated data.

You can automate these notifications with

movieDetailAdapter.setNotifyOnChange(true)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM