【问题标题】:Android Json and RecyclerView is not clickable, MultiLevel problemsAndroid Json和RecyclerView不可点击,MultiLevel问题
【发布时间】:2016-08-15 17:36:11
【问题描述】:

我仍然没有信心使用 android,我在这里有 2 个问题,我想制作具有 3 个级别的 Multi level recyclerView。第一级是类别 RecyclerView,第二级是带有练习列表的 ListView,第三级是详细信息。所以现在我制作了一个不可点击的第一级 recyclerView。另一个问题是如何在 2 级获取 Listview 到 3 级的详细信息?这是我的 1 级片段代码:

public class BallTrainingFragment extends Fragment {

View mRootView;
String URL_TO_HIT = "https://gist.githubusercontent.com/tomasmaks/afbf3e836dabd72c95c4b3ec90e291ed/raw/7ba41948865f78f1ccb4058c61f8c6e06c601300/BasketballTraining.json";
BallTrainingAdapter adapter;
RecyclerView mRecyclerView;
private List<BallTrainingModel> ballTraining;
GridLayoutManager mGridLayoutManager;

public BallTrainingFragment() {
    // Required empty public constructor
}

public static BallTrainingFragment newInstance(int sectionNumber) {
    BallTrainingFragment fragment = new BallTrainingFragment();
    Bundle args = new Bundle();
    args.putInt(Constants.ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create default options which will be used for every
    //  displayImage(...) call if no options will be passed to this method
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity().getApplicationContext())
            .defaultDisplayImageOptions(defaultOptions)
            .build();
    ImageLoader.getInstance().init(config); // Do it on Application start

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_balltraining, container, false);

    mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.balltraining_list);

    mRecyclerView.setHasFixedSize(true);

    // Display under one column
    mGridLayoutManager = new GridLayoutManager(getActivity(), 2);
    mRecyclerView.setLayoutManager(mGridLayoutManager);

    // Set orientation
    mGridLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(mGridLayoutManager);

    return mRootView;
}

@Override
public void onStart() {
    super.onStart();
    new FetchBallTask().execute(URL_TO_HIT);
}

public class FetchBallTask extends AsyncTask<String, String, List<BallTrainingModel>> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }


    @Override
    protected List<BallTrainingModel> doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder buffer = new StringBuilder();
            String line ="";
            while ((line = reader.readLine()) != null){
                buffer.append(line);
            }

            String finalJson = buffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.optJSONArray("BasketballTraining");

            List<BallTrainingModel> ballTrainingModelList = new ArrayList<>();

            Gson gson = new Gson();
            for(int i=0; i<parentArray.length(); i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);
                /**
                 * below single line of code from Gson saves you from writing the json parsing yourself which is commented below
                 */
                BallTrainingModel ballTrainingModel = gson.fromJson(finalObject.toString(), BallTrainingModel.class);
                ballTrainingModel.setCategory(finalObject.getString("category"));
                ballTrainingModel.setThumbnail(finalObject.getString("thumb"));

                List<BallTrainingModel.Cast> castList = new ArrayList<>();
                for(int j=0; j<finalObject.getJSONArray("cast").length(); j++){
                    BallTrainingModel.Cast cast = new BallTrainingModel.Cast();
                    cast.setName(finalObject.getJSONArray("cast").getJSONObject(j).getString("name"));
                    castList.add(cast);
                }
                ballTrainingModel.setCastList(castList);
                // adding the final object in the list
                ballTrainingModelList.add(ballTrainingModel);
            }

            return ballTrainingModelList;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if(connection != null) {
                connection.disconnect();
            }
            try {
                if(reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


    @Override
    protected void onPostExecute(final List<BallTrainingModel> result) {
        super.onPostExecute(result);

        if(result != null) {
            adapter = new BallTrainingAdapter(getActivity().getApplicationContext(), R.layout.fragment_balltraining_content, result);
            mRecyclerView.setAdapter(adapter);
            mRecyclerView.setOnClickListener(new  AdapterView.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = mRecyclerView.indexOfChild(v);

                    BallTrainingModel ballTrainingModel = result.get(position);
                    Intent intent = new Intent(getActivity(), BallTrainingDetailsActivity.class);
                    intent.putExtra("ballTrainingModel", new Gson().toJson(ballTrainingModel));
                    getActivity().startActivity(intent);
                }
            });
        } else {
           Toast.makeText(getActivity().getApplicationContext(), "Not able to fetch data from server, please check url.", Toast.LENGTH_SHORT).show();
        }
    }
}

public class BallTrainingAdapter extends RecyclerView.Adapter<CustomViewHolder> {
    private List<BallTrainingModel> ballTrainingList;
    private int resource;
    private LayoutInflater inflater;

    public BallTrainingAdapter(Context context,int resource, List<BallTrainingModel> objects) {
        ballTrainingList = objects;
        this.resource = resource;
        inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_balltraining_content, null);

        CustomViewHolder viewHolder = new CustomViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(CustomViewHolder customViewHolder, int position) {
        BallTrainingModel ballTraining = ballTrainingList.get(position);
    ImageLoader.getInstance().displayImage(ballTrainingList.get(position).getThumbnail(), customViewHolder.thumbnail);

        //Setting text view title
        customViewHolder.textView.setText(ballTrainingList.get(position).getCategory());
    }

    @Override
    public int getItemCount() {
        return (null != ballTrainingList ? ballTrainingList.size() : 0);
    }

}

public class CustomViewHolder extends RecyclerView.ViewHolder{

    protected TextView textView;
    protected ImageView thumbnail;

    public CustomViewHolder(View view) {
        super(view);
        this.textView = (TextView) view.findViewById(R.id.category);
        this.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
    }
}
}

我认为不可点击的问题出在这行代码上:

mRecyclerView.setOnClickListener(new  AdapterView.OnClickListener() {
            @Override
            public void onClick(View v) {

这里是 2 级片段,它应该呈现 ListView 并且可以点击到 3 级细节。有人可以举个例子来说明如何做到这一点吗?

public class BallTrainingDetailsActivity extends ActionBarActivity {

private TextView name;
private TextView tvCast;

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

    // Showing and Enabling clicks on the Home/Up button
    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    // setting up text views and stuff
    setUpUIViews();

    // recovering data from MainActivity, sent via intent
    Bundle bundle = getIntent().getExtras();
    if(bundle != null){
        String json = bundle.getString("ballTrainingModel");
        BallTrainingModel ballTrainingModel = new Gson().fromJson(json, BallTrainingModel.class);


       StringBuffer stringBuffer = new StringBuffer();
        for(BallTrainingModel.Cast cast : ballTrainingModel.getCastList()){
            stringBuffer.append(cast.getName() + ", ");
        }

        tvCast.setText(stringBuffer);
        //tvStory.setText(movieModel.getStory());

    }

}

private void setUpUIViews() {
    name = (TextView)findViewById(R.id.Name);
}
}

这是 JSON 文件:

{
"BasketballTraining": [
{
  "thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
  "category": "Ball Handling",
  "cast": [
    {
      "name": "Robert Downey Jr."
    },
    {
      "name": "Chris Evans"
    },
    {
      "name": "Mark Ruffalo"
    }
  ]
},
{
  "thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
  "category": "Shooting",
  "cast": [
    {
      "name": "Matthew McConaughey"
    },
    {
      "name": "Anne Hathaway"
    },
    {
      "name": "Jessica Chastain"
    },
    {
      "name": "Wes Bentley"
    }
  ]
},
{
  "thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
  "category": "Post Moves",
  "cast": [
    {
      "name": "Miles Teller"
    },
    {
      "name": "Kate Mara"
    },
    {
      "name": "Michael B. Jordan"
    }
  ]
 },
{
"thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
"category": "Defense",
  "cast": [
    {
      "name": "Christian Bale"
    },
    {
      "name": "Heath Ledger"
    },
    {
      "name": "Aaron Eckhart"
    }
  ]
 },
{
  "thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
  "category": "Scoring",
  "cast": [
    {
      "name": "Viggo Mortensen"
    },
    {
      "name": "Ian McKellen"
    },
    {
      "name": "Elijah Wood"
    }
  ]
  },
{
  "thumb":"https://kycapitalliving.files.wordpress.com/2014/02/basketball-thumbnail.jpg",
  "category": "Others",
  "cast": [
    {
      "name": "Roberto Benigni"
    },
    {
      "name": "Nicoletta Braschi"
    },
    {
      "name": "Giorgio Cantarini"
    }
  ]
}
]
}

这是我的模型:

public class BallTrainingModel {
private String thumbnail;
private String category;
@SerializedName("cast")
private List<Cast> castList;

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

public List<Cast> getCastList() {
    return castList;
}

public String getThumbnail() {
    return thumbnail;
}

public void setThumbnail(String thumbnail) {
    this.thumbnail = thumbnail;
}

public void setCastList(List<Cast> castList) {
    this.castList = castList;
}

public static class Cast {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
}

任何示例或帮助将不胜感激。提前谢谢你。

【问题讨论】:

    标签: android json listview android-recyclerview multi-level


    【解决方案1】:

    RecyclerView适配器中有一个方法onBindView
    你必须在那里申请 setOnClickListener :

    例如:

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
    
    holder.mCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  //Your Code
            });
        }
    }
    

    供参考:检查此link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多