Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
1

Правильное создание динамического фрагмента с JSON

29.12.2017, 23:03. Просмотров 795. Ответов 1
Метки нет (Все метки)

Господа, есть данный фрагмент, не могу его завести(Отметил ошибки комментариями).
Также хочу сказать, что у меня 3 фрагмента с одинаковым использованием JSON, но разными макетами, как вынести JSON-вызов правильно?

И может дадите какие-то рекомендации относительно моего кода как делать лучше и почему?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
 
import com.alexsprod.jsonparserproject.HttpHandler;
import com.alexsprod.jsonparserproject.R;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.util.ArrayList;
import java.util.HashMap;
 
import static android.content.ContentValues.TAG;
 
public class CatOneFragment extends Fragment {
 
    public ListView lv;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fr_cat1, container, false);
        lv = (ListView) view.findViewById(R.id.list_cat1);
        new GetData().execute();
        return view;
    }
 
}
 
class GetData extends AsyncTask<Void, Void, Void> {
 
    private ArrayList<HashMap<String, String>> newslist = new ArrayList<>();
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Toast.makeText("Json Data is downloading", Toast.LENGTH_LONG).show();
    }
 
    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();
        // Making a request to url and getting response
        String url = "http://legs-legs.ru/cat1json.php?json=cat1";
        String jsonStr = sh.makeServiceCall(url);
        newslist = new ArrayList<>();
        Log.e(TAG, "Response from url: " + jsonStr);
        if (jsonStr != null) {
            try {
 
                JSONArray array = new JSONArray(jsonStr);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject c = null;
                    c = array.getJSONObject(i);
                    String id = c.getString("id");
                    String title_cat1 = c.getString("title_cat1");
                    String fulltext_cat1 = c.getString("fulltext_cat1");
                    // tmp hash map for single contact
                    HashMap<String, String> news_item = new HashMap<>();
                    news_item.put("id", id);
                    news_item.put("title_cat1", title_cat1);
                    news_item.put("fulltext_cat1", fulltext_cat1);
                    newslist.add(news_item);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                //CANNOT RESOLVE METHOD
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //CANNOT RESOLVE METHOD
                        Toast.makeText(getApplicationContext(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG).show();
                    }
                });
 
            }
 
        } else {
            Log.e(TAG, "Couldn't get json from server.");
            //CANNOT RESOLVE METHOD
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //CANNOT RESOLVE METHOD
                    Toast.makeText(getApplicationContext(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG).show();
                }
            });
        }
 
        return null;
    }
 
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        SimpleAdapter adapter = new SimpleAdapter(CatOneFragment.this, newslist,
                R.layout.item_cat1, new String[]{"title_cat1", "fulltext_cat1"},
                new int[]{R.id.title_cat1, R.id.fulltext_cat1});
        //CANNOT RESOLVE SYMBOL
        lv.setAdapter(adapter);
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2017, 23:03
Ответы с готовыми решениями:

Повторное создание фрагмента внутри фрагмента ViewPager
Доброго времени суток! Использую внутри фрагмента элемент ViewPager, который сам внутри содержит...

Вызов фрагмента из фрагмента с использованием EventBus
Доброго времени суток! Можно ли использовать EventBus для того, что из Фрагмента 1 вызвать...

Ошибка - Errororg.json.JSONExceprion: Value bd.json of type java.lang.String cannot be converted to JSONObject
Здравствуйте! Есть база данных bd.json, которая находится в проекте в папке assets. Вот содержимое...

Правильное создание динамического массива
Здравствуйте. Хочу чтоб у меня была рабочий код для создания динамического массива. Делал всё по...

Выделение фрагмента строки и создание новой на основе этого фрагмента
У меня есть переменная var a = 'file:///D:/папка/myfile.jpg' Мне нужно выделить из переменной a...

1
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
30.12.2017, 17:26 2
Лучший ответ Сообщение было отмечено AlexRu18 как решение

Решение

В код не вникал, на правильность не претендую.
В разметке ничего особенного - в активити FrameLayout, во фрагменте только RecyclerView.
Плюшки добавлять на свое усмотрение.

gradle

XML
1
2
3
4
5
6
7
8
9
10
 //RecyclerView
 implementation 'com.android.support:recyclerview-v7:26.1.0'
 
 //Retrofit
 implementation 'com.squareup.retrofit2:retrofit:2.3.0'
 implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
 
 //Butter Knife
 implementation 'com.jakewharton:butterknife:8.8.1'
 annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
Application
В манифесте не забыть прописать имя.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class AppController extends Application {
 
    private static AppController sInstance;
    private NetworkServiceRetrofit mNetworkServiceRetrofit;
    public static final String BASE_URL = "http://legs-legs.ru/";
 
    public static synchronized AppController getInstance() {
        return sInstance;
    }
 
    public NetworkServiceRetrofit getRetrofit() {
        return mNetworkServiceRetrofit;
    }
 
    @Override
    public void onCreate() {
 
        super.onCreate();
        sInstance = this;
        initRetrofit();
    }
 
    private void initRetrofit() {
 
        //creating retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(new OkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        mNetworkServiceRetrofit = retrofit.create(NetworkServiceRetrofit.class);
    }
}
Retrofit
Java
1
2
3
4
5
6
7
public interface NetworkServiceRetrofit {
 
    @GET("cat1json.php?")
    Call<List<News>> responseFromServer(
            @Query("json") String json);
 
}
Model
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class News {
 
    @SerializedName("id")
    private String id;
    @SerializedName("title_cat1")
    private String titleCat1;
    @SerializedName("img_cat1")
    private String imgCat1;
    @SerializedName("fulltext_cat1")
    private String fulltextCat1;
    @SerializedName("doptext_cat1")
    private String doptextCat1;
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getTitleCat1() {
        return titleCat1;
    }
 
    public void setTitleCat1(String titleCat1) {
        this.titleCat1 = titleCat1;
    }
 
    public String getImgCat1() {
        return imgCat1;
    }
 
    public void setImgCat1(String imgCat1) {
        this.imgCat1 = imgCat1;
    }
 
    public String getFulltextCat1() {
        return fulltextCat1;
    }
 
    public void setFulltextCat1(String fulltextCat1) {
        this.fulltextCat1 = fulltextCat1;
    }
 
    public String getDoptextCat1() {
        return doptextCat1;
    }
 
    public void setDoptextCat1(String doptextCat1) {
        this.doptextCat1 = doptextCat1;
    }
}
Activity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ButterKnife.bind(this);
 
        if (savedInstanceState == null) {
            initFragment(BlankFragment.newInstance());
        }
    }
 
    private void initFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.main_layout, fragment).commit();
    }
 
    private void replaceFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.main_layout, fragment).commit();
    }
}
Fragment
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class BlankFragment extends Fragment {
 
    private static final String TAG = "BlankFragment";
 
    private List<News> mNewsArray;
    @BindView(R.id.recycler_view)
    RecyclerView mRecyclerView;
 
    public BlankFragment() {}
 
    public static BlankFragment newInstance() {
        return new BlankFragment();
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 
        View view = inflater.inflate(R.layout.fragment_blank, container, false);
        ButterKnife.bind(this, view);
        return view;
    }
 
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
 
        mNewsArray = new ArrayList<>();
        final NewsAdapter newsAdapter = new NewsAdapter(mNewsArray);
        RecyclerView.LayoutManager manager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(newsAdapter);
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), LinearLayoutManager.VERTICAL);
        mRecyclerView.addItemDecoration(dividerItemDecoration);
 
 
        AppController.getInstance().getRetrofit().responseFromServer("cat1").enqueue(new Callback<List<News>>() {
            @Override
            public void onResponse(@NonNull Call<List<News>> call, @NonNull Response<List<News>> response) {
                Log.d(TAG, "onResponse: ");
                mNewsArray = response.body();
                newsAdapter.updateData(mNewsArray);
            }
 
            @Override
            public void onFailure(@NonNull Call<List<News>> call, @NonNull Throwable t) {
                Log.d(TAG, "onFailure: ");
            }
        });
    }
}
Адаптер для RecyclerView:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 
    private List<News> mNewsArray;
 
    public NewsAdapter(List<News> newsArray) {
        mNewsArray = newsArray;
    }
 
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.item, parent, false);
        return new ItemHolder(view);
    }
 
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
 
        News article = mNewsArray.get(position);
        ((ItemHolder) holder).bindView(article);
    }
 
    @Override
    public int getItemCount() {
        return mNewsArray.size();
    }
 
    public void updateData(List<News> newsArray) {
        mNewsArray = newsArray;
        notifyDataSetChanged();
    }
 
    public class ItemHolder extends RecyclerView.ViewHolder {
 
        @BindView(R.id.item)
        TextView mTextView;
 
        public ItemHolder(View itemView) {
            super(itemView);
 
            ButterKnife.bind(this, itemView);
        }
 
        public void bindView(News news) {
 
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(news.getId());
            stringBuilder.append("\n");
            stringBuilder.append(news.getTitleCat1());
            stringBuilder.append("\n");
            stringBuilder.append(news.getImgCat1());
            stringBuilder.append("\n");
            stringBuilder.append(news.getDoptextCat1());
            stringBuilder.append("\n");
            stringBuilder.append(news.getFulltextCat1());
            mTextView.setText(stringBuilder.toString());
 
        }
    }
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2017, 17:26

Правильное удаление динамического двумерного массива
Доброго времени суток форумчани. Ну в общем перейду сразу к делу. О себе: сам пишу на JAVA...

Правильное формирование и разбор JSON
Здравствуйте! Ситуация такова: есть таблица в mySQL, со следующими полями id, description,...

Правильное удаление двумерного динамического массива ( нужен ли delete[] array )
В одном из постов форума Увидев код одного из участников форума: Я пришел в замешательство,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru